tru*_*ppo 7 python list-comprehension generator-expression
我试图找到最快的方法来计算匹配特定过滤器的列表中的项目数.在这种情况下,查找列表中有多少个奇数.
在这样做时,我对比较列表理解与等效生成器表达式的结果感到惊讶:
python -m timeit -s "L = xrange(1000000)" "sum([1 for i in L if i & 1])"
10 loops, best of 3: 109 msec per loop
python -m timeit -s "L = xrange(1000000)" "sum(1 for i in L if i & 1)"
10 loops, best of 3: 125 msec per loop
Run Code Online (Sandbox Code Playgroud)
我也试过L是一个常规列表,不同的大小,但在所有情况下列表理解获胜.
与使用100万个项目创建新列表的listcomp相比,genexp做什么导致它变慢?
(顺便说一下,我找到的最快的方法是:x = 1; len(filter(x.__and__, L)).是的,我知道编写像杀死小猫的代码,我这样做是为了它的乐趣)
Ale*_*lli 15
当基本上无限的内存可用时(在微小的基准测试中总是如此,尽管通常不会出现在实际问题中! - ),列表往往会超过生成器,因为它们只能在一个"大堆"中被分配一次(没有内存碎片等),而生成器需要(内部)额外的努力来通过保留堆栈帧状态以允许恢复执行来避免"大束"方法.
列表方法或生成器方法在真实程序中是否会更快取决于确切的内存情况,包括碎片,这在"微基准"中几乎无法准确再现.IOW,最后,如果你真的关心性能,你必须仔细地对你的实际程序进行基准测试(并且,单独描述),而不仅仅是"玩具"微基准测试.
| 归档时间: |
|
| 查看次数: |
1082 次 |
| 最近记录: |