10大python加速技巧
簡介
目前非常多的數據競賽都是提交程式碼的競賽,而且加入了時間的限制,這就對於我們python程式碼的加速非常重要。本篇文章我們介紹在Python中加速程式碼的一些技巧。可能不是很多,但在一些大的循環或者函數調用時則能帶來巨大的幫助。
十大Python加速技巧,首先導入numpy
import numpy as np
1 List Comprehension
將for的append操作替換為列表中直接產出。這其中加速的主要原因是:
- 在循環的每次迭代中我們都需要調用append,然後在循環的每次迭代中將其作為函數調用。
%%time
numbers = []
for x in range(10000000):
if x % 2 == 0:
numbers.append(x**2)
CPU times: user 2.33 s, sys: 81.6 ms, total: 2.41 s
Wall time: 2.43 s
%%time
numbers = [x**2 for x in range(10000000) if x % 2 == 0]
CPU times: user 1.89 s, sys: 93.8 ms, total: 1.99 s
Wall time: 2 s
2 使用built-in函數
python中非常多自帶的函數採用了較多的加速,有些是使用C進行了加速。所以會比我們自己寫一些for函數等快很多
%%time
def builtin_sum():
return sum(range(100000000))
_ = builtin_sum()
*CPU times: user 1.74 s, sys: 18.8 ms, total: 1.75 s*
*Wall time: 1.78 s*
%%time
def loop_sum():
s = 0
for i in range(100000000):
s += 1
return s
_ = loop_sum()
*CPU times: user 5.44 s, sys: 24.9 ms, total: 5.47 s*
*Wall time: 5.51 s*
3 儘可能不調用函數
在所有的函數語言中,對於函數的調用都是相對更加耗時的,所以在能不適用函數調用的時候儘可能不調用函數,雖然這會使我們的程式碼更佳簡潔易讀。
%%time
def square(num):
return num**2
squares = []
for i in range(1000000):
squares.append(square(i))
CPU times: user 421 ms, sys: 23.7 ms, total: 445 ms
Wall time: 452 ms*
%%time
def squares():
squares = []
for i in range(1000000):
squares.append(i**2)
return squares
_ = squares()
CPU times: user 329 ms, sys: 19.5 ms, total: 348 ms
Wall time: 358 ms
4 儘可能使用numpy對數據進行加速
因為numpy是使用C語言進行過加速的,所以相對於其它很多數據操作是更加快速的。
%%time
python_list = [i for i in range(1000000)]
_ = [i**2 for i in python_list]
CPU times: user 333 ms, sys: 42.7 ms, total: 376 ms
Wall time: 383 ms
%%time
numpy_array = np.array([i for i in range(1000000)])
_ = np.square(numpy_array)
CPU times: user 124 ms, sys: 29.7 ms, total: 153 ms
Wall time: 155 ms
5 numpy >= built-in
%%time
def numpy_sum():
return np.sum(np.arange(0,10000000))
_ =numpy_sum()
CPU times: user 27.1 ms, sys: 10.7 ms, total: 37.8 ms
Wall time: 37.1 ms
%%time
def builtin_sum():
return sum(range(10000000))
_ = builtin_sum()
CPU times: user 169 ms, sys: 1.17 ms, total: 170 ms
Wall time: 170 ms
6 避免Global Variables
Python中的全局變數不是最好的選擇。
- 通常使用局部變數能更好地跟蹤位置和記憶體使用情況。除了記憶體使用之外,Python在檢索局部變數方面也比全局變數略快。
因此,在可能的情況下,最好避免使用全局變數。
7 處理字元串儘可能使用字元串自帶的函數
在處理字元串的時候儘可能使用字元串自帶的函數,往往是針對性的優化過,會比我們調用一些其它的工具包來處理特定的數據類型要快很多。
from collections import Counter
sequence = "AGAGKTAGAT" * 10000000
%%time
def count_string(seq):
return [seq.count("A"), seq.count('G'), seq.count('T'), seq.count('K')]
_ = count_string(sequence)
CPU times: user 293 ms, sys: 2.73 ms, total: 296 ms
Wall time: 296 ms
%%time
def count_Counter(seq):
counter = Counter(seq)
return [counter["A"], counter["G"], counter["T"], counter["K"]]
_ = count_Counter(sequence)
CPU times: user 4.25 s, sys: 30.1 ms, total: 4.28 s
Wall time: 4.36 s
8 使用多個變數一起賦值
%%time
a = 2
b = 3
c = 5
d = 7
CPU times: user 3 µs, sys: 1e+03 ns, total: 4 µs
Wall time: 6.91 µs
%%time
a, b, c, d = 2, 3, 5, 7
CPU times: user 3 µs, sys: 1e+03 ns, total: 4 µs
Wall time: 5.25 µs
9 while 1取代while True
%%time
cnt = 0
while 1:
cnt += 1
if cnt >= 100000:
break
CPU times: user 11.1 ms, sys: 699 µs, total: 11.8 ms
Wall time: 12.6 ms
%%time
cnt = 0
while True:
cnt += 1
if cnt >= 100000:
break
CPU times: user 12.8 ms, sys: 365 µs, total: 13.1 ms
Wall time: 14.2 ms
10 使用最新的python工具包
一般後續的新的工具包往往比過往的python工具包要快很多,所以能更新到新的板塊則可以儘快更新。
原創作者:孤飛-部落格園
原文鏈接://www.cnblogs.com/ranxi169/p/16585192.html

