不要在 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.0415381.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.0474461.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.0226661.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.2294300.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.2638741.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.0697551.013439 MByte

3.减少

Python 提供了一个名为 reduce() 的函数,它允许您以更简洁的方式减少列表。此函数通过将函数和可迭代对象(如列表、元组、系列等)作为参数并返回单个值作为输出来执行函数计算。

本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;

2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;

3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;

4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;

5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/294958.html

(0)
上一篇 2022年12月25日
下一篇 2022年12月25日

相关推荐

发表回复

登录后才能评论