这里有三个process, 每一个任务将经过增长循环提升时间复杂度html
def process1(val, type=None): chr(val % 123) def process2(val, type): if type == "list": [process1(_) for _ in range(val)] elif type == "for": for _ in range(val): process1(_) elif type == "map": list(map(lambda _: process1(_), range(val))) def process3(val, type): if type == "list": [process2(_, type) for _ in range(val)] elif type == "for": for _ in range(val): process2(_, type) elif type == "map": list(map(lambda _: process2(_, type), range(val)))
而后经过三种循环方式,去依次执行三种任务python
def list_comp(): [process1(i, "list") for i in range(length)] # [process2(i, "list") for i in range(length)] # [process3(i, "list") for i in range(length)] def for_loop(): for i in range(length): process1(i, "for") # process2(i, "for") # process3(i, "for") def map_exp(): list(map(lambda v: process1(v, "map"), range(length))) # list(map(lambda v: process2(v, "map"), range(length))) # list(map(lambda v: process3(v, "map"), range(length)))
从上述的图像中,能够直观的看到, 随着任务复杂度的提升以及数据量的增大,每一个循环完成须要的时间也在增长,
可是map方式花费的时间明显比其余两种要更多。 因此在不须要返回处理结果时,选择标准for或者列表解析均可以。git
由于标准for循环和列表解析方式在循环任务复杂度逐渐提升的状况下,处理时间基本没有差别。github
这里有三个task, 每一个任务将经过增长循环提升时间复杂度app
def task1(val, type=None): return chr(val % 123) def task2(val, type): if type == "list": return [task1(_) for _ in range(val)] elif type == "for": res = list() for _ in range(val): res.append(task1(_)) return res elif type == "map": return list(map(lambda _: task1(_), range(val))) def task3(val, type): if type == "list": return [task2(_, type) for _ in range(val)] elif type == "for": res = list() for _ in range(val): res.append(task2(_, type)) return res elif type == "map": return list(map(lambda _: task2(_, type), range(val)))
而后经过三种循环方式,去依次执行三种任务oop
def list_comp(): # return [task1(i, "list") for i in range(length)] return [task2(i, "list") for i in range(length)] # return [task3(i, "list") for i in range(length)] def for_loop(): res = list() for i in range(length): # res.append(task1(i, "for")) res.append(task2(i, "for")) # res.append(task3(i, "for")) return res def map_exp(): # return list(map(lambda v: task1(v, "map"), range(length))) return list(map(lambda v: task2(v, "map"), range(length))) # return list(map(lambda v: task3(v, "map"), range(length)))
从上述的图像中,能够直观的看到, 随着任务复杂度的提升以及数据量的增大,每一个循环完成须要的时间也在增长,
可是明显看出, 使用list_comp列表解析在, 循环须要返回处理结果的每次任务中都表现的很好,基本快于其余两种迭代方式。测试
而标准for循环和map方式在循环任务复杂度逐渐提升的状况下,处理时间基本没有差别。code
我认为可能跟处理的数据量有关系,大部分场景下,使用者只测试了少许的数据(100W如下,好比这篇文章,就是数据量比较少,致使速度的区别不明显),在少许的数据集下,咱们确实看到了map方式比for循环快,甚至有时候比列表解析还稍微快一点,可是当咱们逐渐把数据量增长原来的100倍,这时候差距的凸现出来了。htm
如上图,在小数据集上(100W-1KW之间), 三者消耗的时间差很少相等,可是用map方式遍历和处理,仍是有必定的加速优点。
具体实验代码能够经过Github得到blog