python - 具有连接功能的列表与生成器理解速度

标签 python python-2.7 list-comprehension

<分区>

所以我从官方文档中得到了这些例子。 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

最佳答案

str.join 方法将其可迭代参数转换为列表(如果它还不是列表或元组)。这使得连接逻辑可以多次迭代项目(它进行一次计算结果字符串的大小,然后进行第二次实际复制数据)。

您可以在 the CPython source code 中看到这个:

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,因此生成器的(小)额外开销使其性能变差。

关于python - 具有连接功能的列表与生成器理解速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37782066/

相关文章:

python - 返回对应于行中最大值的列标题

python - 如何在 Python 中将自定义信息保存到 PNG 图像文件?

python - 如何从python中的sql中减去日期

Python:列表理解中某处出错了?

python - 编写此过滤列表理解的最 pythonic 方式是什么?

python ->> Python 中的运算符

python - 使用 matplotlib 在 sankey 图中连接两个以上的系统让我错位

python - 尝试通过源代码开始跟踪 Python 特性和行为

python-2.7 - 使用 .boto 谷歌云存储 API 进行身份验证

python - 在 Python 列表推导式中插入 tkinter 进度条