2017-09-08 81 views
0

我寫的(應無符號值錶轉換爲字節的表格)一個Python代碼:Python。如何讓我的代碼更快?

def foo(in_value, index) 
    TabOut[index*2] = in_value%255 
    TabOut[index*2+1] = in_value//255 



for i in range(0,1024): 
    foo(tabIn[i],i) 

我要運行這個功能每秒200次。如何優化它?

+0

['divmod()'](https://docs.python.org/3.6/library/functions.html#divmod)可能會有所幫助。但我覺得基本面是有缺陷的。首先,我不明白爲什麼你需要一次計算所有1024個計算,並且如果由於某種原因你做了,我不明白爲什麼你需要不止一次地運行(爲什麼不緩存它?),更不用說200x /秒。即使你可以讓我相信*那*是必要的,通過乘法和加法來建立表格「上」而不是分割和減法似乎更快。 – jedwards

+0

恥辱它必須是255不是256 ...除以256會快得多。有一個潛在的技巧,除以256然後乘以(1 + 1/255),但與現代CPU我懷疑你會衡量一個區別。 –

+1

其實我不確定它爲什麼是'%255'。爲什麼你不想使用值255?如果有某些具體原因可能是有用的背景。 –

回答

1

要走得更快,你可以使用divmod功能:

TabOut[index * 2 + 1], TabOut[index * 2] = divmod(value, 255) 

您還可以避免調用函數:

for i in range(1024): 
    TabOut[index * 2 + 1], TabOut[index * 2] = divmod(tabIn[i], 255) 

,並使用經典的迭代:

for index, value in enumerate(tabIn): 
    TabOut[index * 2 + 1], TabOut[index * 2] = divmod(value, 255) 
+0

我認爲你需要恢復指數的順序。偶數人收集'%';奇怪的是'//'。 –

+0

@hiroprotagonist:根據文檔,結果與'(a // b,a%b)'相同。所以,我解決了這個問題。 –

0

一不同的方法是使用一次性填寫產生的構造函數:

from itertools import chain 

tab = list(chain.from_iterable((b, a) 
      for a, b in (divmod(value, 255) for value in tab_in)))