选择最佳迭代技术来优化Python代码
#编程 #生产率 #python #循环

本文最初是在媒介中创建的。

python是一种多功能语言,具有多个可以完成任务的选项。编程中最常见的任务之一是通过一系列元素进行迭代,而Python提供了三种流行的方法:使用for循环,列出综合和高级功能。作为Python开发人员,选择保证最佳实践和最佳性能的最佳方法至关重要。

要比较这些方法的性能并讨论何时使用每种方法,我们将在本文中解释实验。所以,让我们开始!
实验

为了测量每个过程的性能,我们使用了时间库和perf_counter()函数。如果您想了解有关此功能的更多信息,可以查看following link

为了确保准确的结果,我们使用容器将四个处理器线和1GB的内存分配给了该过程。 Python将使用处理器线程默认管理作业。

我们选择了一个简单的数学任务来产生倍数来进行我们的实验。我们运行了100次的过程,每次生成不同数量的倍数。

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198]

在以下结果中,我们分别运行了10,000、100,000和1,000,000次的每个过程。我们分别执行了每个过程,以确保准确的结果并防止内存超负荷可能会干扰测量结果。

我们运行了102次,删除了最低和最高值,以消除受系统性能影响的任何结果。最后,我们确定了每个步骤的最小值和最大值,并计算了所有值的平均值。

用于循环

for循环是python中的基本构造,用于迭代一系列元素。自从语言开始以来,它就已经存在,今天仍然被广泛使用。 for循环使我们一次以序列的元素对每个元素作用。这是一个例子:

import time

def for_loop(rang: int, decimals: int) -> float:
    start_time_for_loop = time.perf_counter()
    my_list_for_loop = []
    n = 2
    for i in range(rang):
        n = i * n
        my_list_for_loop.append(n)
    return round(time.perf_counter() - start_time_for_loop, decimals)

For循环易于阅读和理解,非常适合简单的迭代。但是,对于较大的序列,for循环的性能会由于循环构造的开销而降低。

列表理解

列表综合是在Python中创建列表的简洁方法。它们是编写for循环以创建列表的句法快捷方式。这是一个例子:

import time


def comprehension_loop(rang: int, decimals: int) -> float:
    start_time_comprehension_loop = time.perf_counter()
    n = 2
    my_list_comprehension_loop = [n * i for i in range(rang)]
    return round(time.perf_counter() - start_time_comprehension_loop, decimals)

列表综合通常比for循环更快,因为它们不需要循环构造的开销。与for循环相比,它们也更简洁,更容易阅读,使其成为简单迭代的绝佳选择。

高阶功能

Python具有几个内置的高阶功能,包括mapfilterreduce。这些函数将函数作为参数,并将其应用于序列中的每个元素。这里是使用map的一个示例:


import time


def high_order_func(rang: int, decimals: int) -> float:
    start_time_high_order_func = time.perf_counter()
    n = 2
    my_list_high_order_func = list(map(lambda i: i * n, range(rang)))

高阶功能可以比for循环更快,并列出了复杂操作的综合,因为它们已针对性能进行了优化。与for循环相比,它们也更简洁,更易于阅读,使其成为复杂迭代的绝佳选择。

结果

以下是100个测试的结果,范围为10,000次迭代。如图所示,我们可能会遇到与更长的处理时间相对应的偶尔峰,这可以归因于背景过程引起的处理器负载。但是,在大多数情况下,处理时间与最小变化保持相对一致。

Time for 10000 iterations in 100 executions

CSV文件 平均值 最低 max
循环 1.34 0.79 1.8
理解列表 0.91 0.7 1.3
高阶功能 1.617 1.0 2.58

我们现在可以根据以下100个测试的结果开始了解测试将如何发展,这些测试进行了100,000次迭代。不出所料,高阶功能开始略微落后于其他两个功能。

Time for 100.000 iterations in 100 executions

CSV文件 平均值 最低 max
循环 12.66 10.25 14.23
理解列表 9.53 7.9 11.7
高阶功能 15.59 13.26 17.87

但是,这三个函数之间仍然没有明显的差异,并且执行时间与以前的测试的范围保持在同一范围内。这表明在这种情况下使用高阶功能可能没有显着的性能优势。

总的来说,这些结果为不同功能的性能特征提供了宝贵的见解。必须进行进一步的实验,以确定观察到的趋势是否在较大的数据集和更长的执行时间上保持。

Time for 1000000 iterations in 100 executions

CSV文件 平均值 最低 max
循环 103.61 98.1 130.59
理解列表 89.92 68.8 128.9
高阶功能 141.2 133.86 172.17

最终测试清楚地显示了这三个功能之间的性能有显着差异。具体而言,高阶函数的表现要比其他两个函数慢得多。这个结果为我们提供了更明确的结论。

讨论

何时使用

  • for循环非常适合小序列上的简单迭代。它们易于阅读和理解,不需要专业知识。

  • 列表综合非常适合创建列表并在序列上执行简单操作。它们比for循环更简洁,并且更易于阅读,这使它们成为简单迭代的绝佳选择。

  • 高阶功能比for循环高效,更快,并列出复杂序列操作中的综合。它们也更简洁,更易于阅读,使其适合优雅和高效的代码。

结论

总而言之,测试结果表明,在序列上的简单操作中,高阶函数的效率并不那么快。但是,在这些情况下,循环和列表综合是更好的选择,并且更易于阅读和理解。因此,在选择迭代技术之前,必须考虑任务的复杂性。总而言之,循环非常适合简单的迭代和小序列,列表综合是创建简单列表和操作的理想选择,而高阶功能则有效,更适合于大序列上的复杂操作。