首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算len(str(sequence _of _numbers)) vs len('sequence_of_numbers')

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

Stack Overflow用户
提问于 2016-05-02 17:44:32
回答 4查看 94关注 0票数 0

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

代码语言:javascript
复制
import math
math.factorial(100000)

我将输出作为参数粘贴到str()中,并称为len() (这个数字很大,因此不能合理地粘贴在这里):

代码语言:javascript
复制
print len(str(<copy-pasted output from math.factorial()>))

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

代码语言:javascript
复制
print len('<same copy-pasted output>')

这一次的结果是即时的。

有谁能解释一下:为什么str()方法比' '方法花费的时间更长,因为它们都代表字符串?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-05-02 17:59:23

将一个456574位数字转换为一个字符串不是没有代价的;这是一个大字符串,将近五十万个字符几乎等于半兆内存(在OS系统上,使用Python2.7):

代码语言:javascript
复制
>>> 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生成该字符串需要一段时间,而操作系统则需要一段时间来分配所需的内存:

代码语言:javascript
复制
>>> 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个字节)。

票数 2
EN

Stack Overflow用户

发布于 2016-05-02 17:47:28

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

票数 1
EN

Stack Overflow用户

发布于 2016-05-02 17:51:51

以100000000000作为代理--一个非常大的数字:

print(len(str(100000000000)))必须在计算其长度之前将100000000000 ( int对象)转换为string对象。相对来说,创建一个很长的字符串需要很长的时间。

print(len('100000000000'))不必执行字符串转换,因为引用的数字是字符串文本,即已经是string对象,因此速度更快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36988413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档