Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么len(s)的电话这么慢?_Python_String_Python 3.x - Fatal编程技术网

Python 为什么len(s)的电话这么慢?

Python 为什么len(s)的电话这么慢?,python,string,python-3.x,Python,String,Python 3.x,根据答案,呼叫len(s)的复杂度为O(1)。 那么,为什么在下载的27kb文件上调用它比在1kb文件上调用慢得多呢 27kb 1kb 问题是,此示例在我的开发计算机上运行,这是一台正常工作的pc。应该运行代码的计算机是RaspberryPi,速度慢了几个数量级。在设置阶段尝试将r.text分配给局部变量。它不是一个简单的属性,您正在计时构建值的工作,该值从内部缓存的字节解码到str,而不仅仅是len调用 帽子提示给Martijn Pieters,以获得精确的参考资料 因为你下载了更多的数据,这

根据答案,呼叫
len(s)
的复杂度为O(1)。 那么,为什么在下载的27kb文件上调用它比在1kb文件上调用慢得多呢

27kb

1kb


问题是,此示例在我的开发计算机上运行,这是一台正常工作的pc。应该运行代码的计算机是RaspberryPi,速度慢了几个数量级。

在设置阶段尝试将
r.text
分配给局部变量。它不是一个简单的属性,您正在计时构建值的工作,该值从内部缓存的
字节
解码到
str
,而不仅仅是
len
调用


帽子提示给Martijn Pieters,以获得精确的参考资料

因为你下载了更多的数据,这需要更多的时间?你期待什么?@spectras:事实上,他们并没有为下载计时。@MartijnPieters>20次27kb的重复,总共是540kb@spectras:很容易复制(对我来说是3.6秒)。
timeit()
的第二个参数是设置,而不是计时测试。@MartijnPieters>好的,我使用定义的字符集进行了测试,所以速度要快得多。我错误地认为
text
在下载过程中一直是懒惰的,因此它最终会在定时测试中阻塞。(基本上,stream=True时会发生什么情况)。每次都是将数据从字节解码为Unicode。@MartijnPieters:啊,我将把它添加到答案中。谢谢我一直在寻找代码以获得更完整的答案。请参阅和@user4815162342:是的,因为标题中没有编解码器,所以使用chardet进行统计分析并猜测要使用的编码。每次。@MartijnPieters人们都希望执行分析所需的时间在文本大小上是线性的。考虑到建立分析的时间,在较小的文件上测量较慢的性能(每单位文本)甚至是合理的。
>>> timeit.timeit('x = len(r.text)', 'from requests import get; r = get("https://cdn.discordapp.com/attachments/280190011918254081/293010649754370048/Journal.170203183244.01.log")', number = 20)
5.78126864130499
>>> timeit.timeit('x = len(r.text)', 'from requests import get; r = get("https://cdn.discordapp.com/attachments/280190011918254081/293016636288663562/Journal.170109120508.01.log")', number = 20)
0.00036539355403419904