我正在计算100,000个数字!这恰好是456574.我做了这样的阶乘:
import math
math.factorial(100000)
我将其输出作为参数复制粘贴到str()
并调用len()
(数字很大,因此无法合理地粘贴在此处):
print len(str(<copy-pasted output from math.factorial()>))
并且花了一些时间来计算位数!然后我在引号之间粘贴了相同的输出:
print len('<same copy-pasted output>')
这次结果是即时的。
有人可以解释一下:为什么str()
方法比' '
方法花费的时间更长,而它们都代表字符串?
答案 0 :(得分:2)
将456574位数转换为字符串并非没有成本;这是一个大字符串,将近五十万个字符几乎是半兆字节的内存(在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文字,并生成一个整数对象在转换为字符串之前可以先进行。
您无法将其与长度为1('p'
)的字符串进行比较,该字符串仅占用几个字节的内存(在我的系统上为38字节)。
答案 1 :(得分:1)
print len('100000!')
实际上不会计算阶乘,而只是字符串'100000!'
的长度,这比实际计算阶乘
答案 2 :(得分:0)
以100000000000作为代理非常大的数字:
print(len(str(100000000000)))
必须在计算其长度之前将100000000000,int
对象转换为string
对象。相对来说,创建一个很长的字符串需要很长时间。
print(len('100000000000'))
不必执行字符串转换,因为带引号的数字是字符串 literal ,即已经是string
个对象,所以它更快。
答案 3 :(得分:0)
len(str(result))
首先从result
创建一个字符串,然后计算它的长度。
另一方面,len('result')
已经在引号中包含了字符串,因此在运行代码之前,您基本上已经完成了将其转换为字符串的工作。
我想在大数字上做str()
需要花费很多时间。