python - 多次迭代的性能

标签 python performance iteration

想知道进行一次迭代与多次迭代对性能的影响。我在 Python 中工作——我不确定这是否会影响答案。

考虑尝试对列表中的每个项目执行一系列数据转换。

def one_pass(my_list):
    for i in xrange(0, len(my_list)):
        my_list[i] = first_transformation(my_list[i])
        my_list[i] = second_transformation(my_list[i])
        my_list[i] = third_transformation(my_list[i])
    return my_list

def multi_pass(my_list):
    range_end = len(my_list)
    for i in xrange(0, range_end):
       my_list[i] = first_transformation(my_list[i])

    for i in xrange(0, range_end):
       my_list[i] = second_transformation(my_list[i])

    for i in xrange(0, range_end):
       my_list[i] = third_transformation(my_list[i])

    return my_list

现在,除了可读性问题,严格来说,在性能方面,one_pass 相对于 multi_pass 是否有真正的优势?假设大部分工作发生在转换函数本身,那么 multi_pass 中的每次迭代不会只花费大约 1/3 的时间吗?

最佳答案

不同之处在于您正在阅读的值和代码在 CPU's cache 中出现的频率。 .

如果 my_list 的元素很大,但适合 CPU 缓存,第一个版本可能会有用。另一方面,如果转换的(字节)代码很大,缓存操作可能比缓存数据更好。

这两个版本都可能比更具可读性的方式慢:

def simple(my_list):
    return [third_transformation(second_transformation(first_transformation(e)))
            for e in my_list]

Timing it产量:

one_pass: 0.839533090591
multi_pass: 0.840938806534
simple: 0.569097995758

关于python - 多次迭代的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13407022/

相关文章:

python - 没有名为 graphframes Jupyter Notebook 的模块

python - 调用包含 API 调用的类和函数时没有返回值

regex - 为什么字符类比交替更快?

arrays - Ruby 中哪个更快, `arr += [x]` 或 `arr << x`

java - 用 Java 读取 CSV 文件的最快方法

java - 如何在java中创建一个每次迭代返回不同变量的循环?

python - 循环树状结构

python - 无法查询 ListField(EmbeddedDocumentField)

python - 使用 python pandas 如何进行一些分析以识别有效的手机号码

ruby - 是否有更惯用的方式来表达循环中剩余的迭代次数?