gpt4 book ai didi

Python 性能 : why Counter(r) is NOT 100 times faster than {c:r. count(c) for c in set(r)}?

转载 作者:太空宇宙 更新时间:2023-11-03 10:59:40 25 4
gpt4 key购买 nike

<分区>

r为一个字符串,我们要统计r中每个字符的个数。如果我们快速推理:

Counter(r)

快大约100倍
{c:r.count(c) for c in set(r)}

确实:在普通文本中,大约有 100 个不同的字符(大写/未大写/标点符号/数字...)因此 .count 将在所有字符串 r 上运行 100 次 而不是只运行一次的 Counter

然而,时序与上述推理不符(r是《指环王》所有书籍的内容):

In [71]: %timeit d = collections.Counter(r)
10 loops, best of 3: 98.8 ms per loop

In [72]: %timeit d = {c:r.count(c) for c in set(r)}
10 loops, best of 3: 114 ms per loop

In [73]: len(r)
Out[73]: 972550

即使我们增加字符串的大小,比例也是一样的

In [74]: r = r*100

In [79]: %time d = collections.Counter(r)
CPU times: user 9.9 s, sys: 12 ms, total: 9.91 s
Wall time: 9.93 s

In [81]: %time d = {c:r.count(c) for c in set(r)}
CPU times: user 11.5 s, sys: 0 ns, total: 11.5 s
Wall time: 11.6 s

我看过.count的源码,它没有做任何缓存/操作(除非我没看好的实现函数):https://hg.python.org/cpython-fullhistory/file/tip/Objects/stringlib/fastsearch.h .你如何解释这个事实?

编辑:我的配置:Lubuntu 15.04 上的 Python 3.4.3(默认,2015 年 3 月 26 日,22:07:01)。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com