不要在 Python 中运行循环,而是使用它们!
作者:互联网
在这篇博客中,我将带您了解一些比 Python 中的循环更快的替代方法。
让我们开始!
1.过滤
根据名称我们很容易猜到它的作用。它为我们过滤可迭代对象。我们将以函数的形式传递过滤条件,这个函数将用于过滤可迭代对象中的每个元素。
句法:
filter(function, iterable)
现在让我们比较python过滤器与 for 循环和 while 循环的性能。
在这里,我创建了一个包含 100000 个连续项目的列表,然后将计算偶数的阶乘。最后,我们将对这些阶乘值求和。
Note:I'm running all of these codes in google colab; depending on your system these results could vary
# 使用for循环 import math import time import resource import sys time_start = time.perf_counter() sys.set_int_max_str_digits( 0 ) def factorial ( n ): return math.factorial(n) test_list = list ( range ( 1 , 100000 )) result = [] for i in range ( len (test_list)) : if test_list[i] % 2 == 0 : result.append(test_list[i]) print ( sum (result)) time_elapsed = (time.perf_counter() - time_start) memMb=resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/ 1024.0 / 1024.0 print ( "%f 秒 % f MByte" % (time_elapsed,memMb)) # 输出 2499950000 0.041538秒1.082287 MByte
# 使用 while 循环 import math import time import resource import sys time_start = time.perf_counter() sys.set_int_max_str_digits( 0 ) def factorial ( n ): return math.factorial(n) test_list = list ( range ( 1 , 100000 )) result = [] i= 0 while i < len (test_list) : if test_list[i] % 2 == 0 : result.append(test_list[i]) i = i + 1 print ( sum (result)) time_elapsed = (time.perf_counter() - time_start) memMb=resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/ 1024.0 / 1024.0 print ( "%f secs %f MByte" %复制代码(time_elapsed,memMb)) # 输出 2499950000 0.047446秒1.085056 MByte
# 使用过滤器 import math import time import resource import sys time_start = time.perf_counter() sys.set_int_max_str_digits( 0 ) def factorial ( n ): return math.factorial(n) test_list = list ( range ( 1 , 100000 )) result =过滤器( lambda x: x % 2 == 0 , test_list) print ( sum ((result))) time_elapsed = (time.perf_counter() - time_start) memMb=resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/ 1024.0 / 1024.0 print ( "%f secs %f MByte" % (time_elapsed,memMb)) # 输出 2499950000 0.022666秒1.087833兆字节
2.地图
如果您想将一个函数应用于可迭代对象(如列表、元组甚至pandas系列)的每个值,此函数非常有用。
语法:
map(function, iterable)
现在,让我们看看如何在 python 中使用 map 而不是循环。
# 使用for循环 import math import time import resource import sys time_start = time.perf_counter() sys.set_int_max_str_digits( 0 ) def factorial ( n ): return math.factorial(n) test_list = list ( range ( 1 , 10000 )) result = 0 for i in range ( len (test_list)) : test_list[i] = factorial(test_list[i]) print ( sum(test_list)) time_elapsed = (time.perf_counter() - time_start) memMb=resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/ 1024.0 / 1024.0 打印( "%f secs %f MByte" % (time_elapsed,memMb)) #output 284654436382457541 ..................... 0420940313 12.229430秒0.167130兆字节
# 使用 while 循环 import math import time import resource import sys time_start = time.perf_counter() sys.set_int_max_str_digits( 0 ) def factorial ( n ): return math.factorial(n) test_list = list ( range ( 1 , 10000 )) 结果= 0 i= 0 while i < len (test_list) : test_list[i] = factorial(test_list[i]) i = i + 1 print (总和(test_list)) time_elapsed = (time.perf_counter() - time_start) memMb=resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/ 1024.0 / 1024.0 print ( "%f secs %f MByte" % (time_elapsed,memMb)) #输出 284654436382457541 ..................... .0420940313 11.263874秒1.013439兆字节
现在,如果我们使用 map 函数运行相同的代码
# 使用 Map import math import time import resource import sys time_start = time.perf_counter() sys.set_int_max_str_digits( 0 ) def factorial ( n ): return math.factorial(n) test_list = list ( range ( 1 , 10000 )) result =地图(阶乘,test_list) 打印(总和((结果))) time_elapsed =(time.perf_counter() - time_start) memMb = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss /1024.0 / 1024.0 #Output 284654436382457541 ..................... .0420940313 10.069755秒1.013439 MByte
3.减少
Python 提供了一个名为 reduce() 的函数,它允许您以更简洁的方式减少列表。此函数通过将函数和可迭代对象(如列表、元组、系列等)作为参数并返回单个值作为输出来执行函数计算。