我正在计算十万位数,正好是456574位。我做了这样的阶乘:
import math
math.factorial(100000)我将输出作为参数粘贴到str()中,并称为len() (这个数字很大,因此不能合理地粘贴在这里):
print len(str(<copy-pasted output from math.factorial()>))计算数字的数量花了一些时间!然后,我在引号之间粘贴了相同的输出:
print len('<same copy-pasted output>')这一次的结果是即时的。
有谁能解释一下:为什么str()方法比' '方法花费的时间更长,因为它们都代表字符串?
发布于 2016-05-02 17:59:23
将一个456574位数字转换为一个字符串不是没有代价的;这是一个大字符串,将近五十万个字符几乎等于半兆内存(在OS系统上,使用Python2.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.4354581832885742Python生成该字符串需要一段时间,而操作系统则需要一段时间来分配所需的内存:
>>> 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文字,并首先生成一个整数对象,然后才能转换为字符串。
您不能将其与长度为1的字符串('p')进行比较,该字符串只需要几个字节的内存(在我的系统中为38个字节)。
发布于 2016-05-02 17:47:28
print len('100000!')不会实际计算阶乘,而是只计算字符串'100000!'的长度,这比实际计算阶乘要快得多。
发布于 2016-05-02 17:51:51
以100000000000作为代理--一个非常大的数字:
print(len(str(100000000000)))必须在计算其长度之前将100000000000 ( int对象)转换为string对象。相对来说,创建一个很长的字符串需要很长的时间。
print(len('100000000000'))不必执行字符串转换,因为引用的数字是字符串文本,即已经是string对象,因此速度更快。
https://stackoverflow.com/questions/36988413
复制相似问题