使用连接函数的列表与生成器理解速度[重复]
- 2025-02-11 09:50:00
- admin 原创
- 82
问题描述:
所以我从官方文档中得到了这些例子。https
://docs.python.org/2/library/timeit.html
究竟是什么使得第一个例子(生成器表达式)比第二个例子(列表理解)慢?
>>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
0.8187260627746582
>>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
0.7288308143615723
解决方案 1:
如果该str.join
方法的可迭代参数还不是列表或元组,则将其转换为列表。这样,连接逻辑就可以多次迭代项目(它会进行一次计算结果字符串的大小,然后再进行第二次实际复制数据)。
你可以在CPython 源代码中看到这一点:
PyObject *
PyUnicode_Join(PyObject *separator, PyObject *seq)
{
/* lots of variable declarations at the start of the function omitted */
fseq = PySequence_Fast(seq, "can only join an iterable");
/* ... */
}
C API 中的函数PySequence_Fast
正是我所描述的。它将任意可迭代对象转换为列表(本质上是通过调用list
它),除非它已经是列表或元组。
生成器表达式转换为列表意味着生成器的通常好处(更小的内存占用和短路的可能性)不适用于str.join
,因此生成器的(小)额外开销会使其性能变差。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD