加速Python列表和字典,让你代码更加高效

pythonxuexi 2020-05-21

今天,我们将讨论Python中的优化技术。在本文中,您将了解如何通过避免在列表和字典中进行重新计算来加快代码的速度。

加速Python列表和字典,让你代码更加高效

我们先编写一个装饰器函数来计算函数的执行时间,方便测验不同代码的速度:

import functools 
import time 
 
def timeit(func): 
    @functools.wraps(func) 
    def newfunc(*args, **kwargs): 
        startTime = time.time() 
        func(*args, **kwargs) 
        elapsedTime = time.time() - startTime 
        print('function - {}, took {} ms to complete'.format(func.__name__, int(elapsedTime * 1000))) 
    return newfunc 

一、避免在列表中重新评估

1. 在循环内

代码:

@timeit 
def append_inside_loop(limit): 
    nums = [] 
    for num in limit: 
        nums.append(num) 
 
append_inside_loop(list(range(1, 9999999))) 

在上面的函数中.append每次通过循环重新计算的函数引用。执行后,上述函数所花费的总时间:

o/p - function - append_inside_loop, took 529 ms to complete 

2. 在循环外

代码:

@timeit 
def append_outside_loop(limit): 
    nums = [] 
    append = nums.append 
    for num in limit: 
        append(num) 
 
append_outside_loop(list(range(1, 9999999))) 

在上面的函数中,我们对nums.append在循环外部估值,并在循环内部使用append为变量。总时间:

o/p - function - append_outside_loop, took 328 ms to complete 

如您所见,当我们在​for循环外部追加为一个本地变量,这将花费更少的时间,可以将代码加速201 ms。​

二、避免在字典中重新求值

1. 在循环内部

代码:

@timeit 
def inside_evaluation(limit): 
    data = {} 
    for num in limit: 
        data[num] = data.get(num, 0) + 1 
 
inside_evaluation(list(range(1, 9999999))) 

上述函数所花费的总时间:

o/p - function - inside_evaluation, took 1400 ms to complete 

2. 在循环外

代码:

@timeit 
def outside_evaluation(limit): 
    data = {} 
    get = data.get 
    for num in limit: 
        data[num] = get(num, 0) + 1 
 
 
outside_evaluation(list(range(1, 9999999))) 

上述函数所花费的总时间:

o/p - function - outside_evaluation, took 1189 ms to complete 

相关推荐