python中乘法和除法_python – NumPy的性能:uint8对比浮动和乘法与除法?
我剛剛注意到,我的腳本的執(zhí)行時間幾乎減少了一半,只是將乘法更改為一個部門.
為了調(diào)查這個,我寫了一個小例子:
import numpy as np
import timeit
# uint8 array
arr1 = np.random.randint(0, high=256, size=(100, 100), dtype=np.uint8)
# float32 array
arr2 = np.random.rand(100, 100).astype(np.float32)
arr2 *= 255.0
def arrmult(a):
"""
mult, read-write iterator
"""
b = a.copy()
for item in np.nditer(b, op_flags=["readwrite"]):
item[...] = (item + 5) * 0.5
def arrmult2(a):
"""
mult, index iterator
"""
b = a.copy()
for i, j in np.ndindex(b.shape):
b[i, j] = (b[i, j] + 5) * 0.5
def arrmult3(a):
"""
mult, vectorized
"""
b = a.copy()
b = (b + 5) * 0.5
def arrdiv(a):
"""
div, read-write iterator
"""
b = a.copy()
for item in np.nditer(b, op_flags=["readwrite"]):
item[...] = (item + 5) / 2
def arrdiv2(a):
"""
div, index iterator
"""
b = a.copy()
for i, j in np.ndindex(b.shape):
b[i, j] = (b[i, j] + 5) / 2
def arrdiv3(a):
"""
div, vectorized
"""
b = a.copy()
b = (b + 5) / 2
def print_time(name, t):
print("{: <10}: {: >6.4f}s".format(name, t))
timeit_iterations = 100
print("uint8 arrays")
print_time("arrmult", timeit.timeit("arrmult(arr1)", "from __main__ import arrmult, arr1", number=timeit_iterations))
print_time("arrmult2", timeit.timeit("arrmult2(arr1)", "from __main__ import arrmult2, arr1", number=timeit_iterations))
print_time("arrmult3", timeit.timeit("arrmult3(arr1)", "from __main__ import arrmult3, arr1", number=timeit_iterations))
print_time("arrdiv", timeit.timeit("arrdiv(arr1)", "from __main__ import arrdiv, arr1", number=timeit_iterations))
print_time("arrdiv2", timeit.timeit("arrdiv2(arr1)", "from __main__ import arrdiv2, arr1", number=timeit_iterations))
print_time("arrdiv3", timeit.timeit("arrdiv3(arr1)", "from __main__ import arrdiv3, arr1", number=timeit_iterations))
print("\nfloat32 arrays")
print_time("arrmult", timeit.timeit("arrmult(arr2)", "from __main__ import arrmult, arr2", number=timeit_iterations))
print_time("arrmult2", timeit.timeit("arrmult2(arr2)", "from __main__ import arrmult2, arr2", number=timeit_iterations))
print_time("arrmult3", timeit.timeit("arrmult3(arr2)", "from __main__ import arrmult3, arr2", number=timeit_iterations))
print_time("arrdiv", timeit.timeit("arrdiv(arr2)", "from __main__ import arrdiv, arr2", number=timeit_iterations))
print_time("arrdiv2", timeit.timeit("arrdiv2(arr2)", "from __main__ import arrdiv2, arr2", number=timeit_iterations))
print_time("arrdiv3", timeit.timeit("arrdiv3(arr2)", "from __main__ import arrdiv3, arr2", number=timeit_iterations))
這將打印以下時間:
uint8 arrays
arrmult : 2.2004s
arrmult2 : 3.0589s
arrmult3 : 0.0014s
arrdiv : 1.1540s
arrdiv2 : 2.0780s
arrdiv3 : 0.0027s
float32 arrays
arrmult : 1.2708s
arrmult2 : 2.4120s
arrmult3 : 0.0009s
arrdiv : 1.5771s
arrdiv2 : 2.3843s
arrdiv3 : 0.0009s
我一直認(rèn)為乘法在計算上比分部便宜.然而,對于uint8,一個部門似乎幾乎是有效的兩倍.這是否與事實有關(guān),* 0.5必須計算浮點數(shù)中的乘法,然后將結(jié)果轉(zhuǎn)換為整數(shù)?
至少對于浮標(biāo),乘法似乎比分裂更快.這一般是正確的嗎?
為什么uint8中的乘法比float32中的乘法更多?我認(rèn)為一個8位無符號整數(shù)應(yīng)該比32位浮點計算快得多嗎?
有人可以“神秘化”嗎?
編輯:有更多的數(shù)據(jù),我已經(jīng)包括向量化函數(shù)(如建議)和添加的索引迭代器.矢量化的功能要快得多,因此并不是真正的可比性.然而,如果向量化函數(shù)的timeit_iterations設(shè)置得高得多,則結(jié)果是uint8和float32的乘法更快.我想這更混淆了嗎?
實際上,乘法總是比劃分更快,但是for循環(huán)中的主要性能泄漏不是算術(shù)運(yùn)算,而是循環(huán)本身.盡管這不能解釋為什么循環(huán)對于不同的操作有不同的表現(xiàn).
EDIT2:像@jotasi已經(jīng)說過,我們正在尋找一個完整的分解與乘法和int(或uint8)與float(或float32)的解釋.另外,解釋向量化方法和迭代器的不同趨勢將是有趣的,如在矢量化的情況下,分割似乎更慢,而在迭代器情況下更快.
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的python中乘法和除法_python – NumPy的性能:uint8对比浮动和乘法与除法?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python自动下载app_APP自动化
- 下一篇: abap 函数远程启用的模块参数_SAP