多次迭代的性能

Cla*_*ell 4 python iteration performance

想知道一次迭代与多次迭代对性能的影响.我在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
Run Code Online (Sandbox Code Playgroud)

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

phi*_*hag 5

不同之处在于您正在读取的值和代码在CPU缓存中的频率.

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

两个版本都可能比更易读的方式更慢:

def simple(my_list):
    return [third_transformation(second_transformation(first_transformation(e)))
            for e in my_list]
Run Code Online (Sandbox Code Playgroud)

定时它产生:

one_pass: 0.839533090591
multi_pass: 0.840938806534
simple: 0.569097995758
Run Code Online (Sandbox Code Playgroud)