计算len(str(sequence\u of \u numbers))vs len('sequence\u of \u numbers')

2024-09-24 22:21:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我在计算十万位数!,正好是456574。我是这样做的:

import math
math.factorial(100000)

我把它的输出作为参数复制粘贴到str()并调用len()(这个数字很大,所以不能合理地粘贴到这里):

print len(str(<copy-pasted output from math.factorial()>))

计算数字的数目花了一些时间!然后我在引号之间粘贴了相同的输出:

print len('<same copy-pasted output>')

这一次的结果是瞬间的。你知道吗

有人能解释一下:str()方法比' '方法花费的时间更长吗,因为它们都表示字符串?你知道吗


Tags: 方法importoutput参数len粘贴时间数字
3条回答

将一个456574位数字转换成一个字符串并非没有成本;这是一个字符串,将近50万个字符几乎是半兆字节的内存(在OS X系统上,使用Python 2.7):

>>> import math
>>> import sys
>>> p = math.factorial(100000)
>>> p_str = str(p)
>>> sys.getsizeof(p_str)  # memory footprint in bytes
456611
>>> 456611 / 1024.0 / 1024.0  # memory footprint in megabytes
0.4354581832885742

Python需要一点时间来生成该字符串,操作系统需要分配所需的内存:

>>> from timeit import timeit
>>> timeit('str(p)', 'from __main__ import p', number=10)  # convert to a string, 10 times
25.308346033096313

因此,平均需要2.5秒才能将这些数字转换成字符串。如果您实际复制并粘贴了所有这些数字(而不是像我那样使用变量),那么您还需要添加更多的时间,因为Python必须解析int文本,并在转换为字符串之前首先生成integer对象。你知道吗

您无法将其与长度为1('p')的字符串进行比较,后者只占用几个字节的内存(在我的系统中为38字节)。你知道吗

len(str(result))首先从result创建一个字符串,然后计算它的长度。你知道吗

另一方面,len('result')在引号中已经有了这个字符串,所以在运行代码之前基本上已经把它转换成了一个字符串。你知道吗

我猜对大数做str()需要很多时间。你知道吗

print len('100000!')不会实际计算阶乘,而只计算字符串长度'100000!',这比实际计算阶乘快得多

相关问题 更多 >