本文最初是在媒介中创建的。
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具有几个内置的高阶功能,包括map
,filter
和reduce
。这些函数将函数作为参数,并将其应用于序列中的每个元素。这里是使用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次迭代。如图所示,我们可能会遇到与更长的处理时间相对应的偶尔峰,这可以归因于背景过程引起的处理器负载。但是,在大多数情况下,处理时间与最小变化保持相对一致。
CSV文件 | 平均值 | 最低 | max |
---|---|---|---|
循环 | 1.34 | 0.79 | 1.8 |
理解列表 | 0.91 | 0.7 | 1.3 |
高阶功能 | 1.617 | 1.0 | 2.58 |
我们现在可以根据以下100个测试的结果开始了解测试将如何发展,这些测试进行了100,000次迭代。不出所料,高阶功能开始略微落后于其他两个功能。
CSV文件 | 平均值 | 最低 | max |
---|---|---|---|
循环 | 12.66 | 10.25 | 14.23 |
理解列表 | 9.53 | 7.9 | 11.7 |
高阶功能 | 15.59 | 13.26 | 17.87 |
但是,这三个函数之间仍然没有明显的差异,并且执行时间与以前的测试的范围保持在同一范围内。这表明在这种情况下使用高阶功能可能没有显着的性能优势。
总的来说,这些结果为不同功能的性能特征提供了宝贵的见解。必须进行进一步的实验,以确定观察到的趋势是否在较大的数据集和更长的执行时间上保持。
CSV文件 | 平均值 | 最低 | max |
---|---|---|---|
循环 | 103.61 | 98.1 | 130.59 |
理解列表 | 89.92 | 68.8 | 128.9 |
高阶功能 | 141.2 | 133.86 | 172.17 |
最终测试清楚地显示了这三个功能之间的性能有显着差异。具体而言,高阶函数的表现要比其他两个函数慢得多。这个结果为我们提供了更明确的结论。
讨论
何时使用
-
for
循环非常适合小序列上的简单迭代。它们易于阅读和理解,不需要专业知识。 -
列表综合非常适合创建列表并在序列上执行简单操作。它们比
for
循环更简洁,并且更易于阅读,这使它们成为简单迭代的绝佳选择。 -
高阶功能比
for
循环高效,更快,并列出复杂序列操作中的综合。它们也更简洁,更易于阅读,使其适合优雅和高效的代码。
结论
总而言之,测试结果表明,在序列上的简单操作中,高阶函数的效率并不那么快。但是,在这些情况下,循环和列表综合是更好的选择,并且更易于阅读和理解。因此,在选择迭代技术之前,必须考虑任务的复杂性。总而言之,循环非常适合简单的迭代和小序列,列表综合是创建简单列表和操作的理想选择,而高阶功能则有效,更适合于大序列上的复杂操作。