计算len(str(sequence _of _numbers))vs len(' sequence_of_numbers')

时间:2016-05-02 17:44:32

标签: python python-2.7

我正在计算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()方法比' '方法花费的时间更长,而它们都代表字符串?

4 个答案:

答案 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()需要花费很多时间。