簡體   English   中英

提高numpy三角函數的運算性能

[英]Improve performance of operation on numpy trigonometric functions

我有一個相當大的代碼,我需要優化。 在使用time.time()進行一些分析之后,我發現占用最多處理時間的行(它執行了數千次)是這樣的:

A = np.cos(a) * np.cos(b) - np.sin(a) * np.sin(b) * np.sin(c - d)

所有變量都可以隨機定義:

N = 5000
a = np.random.uniform(0., 10., N)
b = np.random.uniform(0., 50., N)
c = np.random.uniform(0., 30., N)
d = np.random.uniform(0., 25., N)

有沒有辦法提高A的計算性能? 由於我已經使用numpy ,我幾乎沒有想法。

通過使用乘積和總和。 身份 ,你可以減少三角形的數量。 函數調用。 在下文中, func1func2計算相同的值,但func2對trig的調用次數較少。 職能。

import numpy as np

def func1(a, b, c, d):
    A = np.cos(a) * np.cos(b) - np.sin(a) * np.sin(b) * np.sin(c - d)
    return A

def func2(a, b, c, d):
    s = np.sin(c - d)
    A = 0.5*((1 - s)*np.cos(a - b) + (1 + s)*np.cos(a + b))
    return A

這是N = 5000的時序比較:

In [48]: %timeit func1(a, b, c, d)
1000 loops, best of 3: 374 µs per loop

In [49]: %timeit func2(a, b, c, d)
1000 loops, best of 3: 241 µs per loop

您是否嘗試使用像Numba,Cython,Pythran或其他任何東西的Python加速器?

我和Pythran做了一些測試。 結果如下:

原始代碼:

  • Python + numpy:1000個循環,最佳3:每循環1.43毫秒
  • Pythran:1000個循環,每個循環最好3:777usec
  • Pythran + SIMD:1000次循環,最佳3:488次循環使用

代碼由Warren提供:

  • Python + numpy:1000次循環,最佳3:每循環1.05毫秒
  • Pythran:1000個循環,每個循環最好3:646 usec
  • Pythran + SIMD:1000次循環,最佳3:425次循環使用

這是在N = 5000的情況下完成的

  • 更新*:

這是代碼:

# pythran export func1(float[], float[], float[], float[])
# pythran export func2(float[], float[], float[], float[])
import numpy as np

def func1(a, b, c, d):
    A = np.cos(a) * np.cos(b) - np.sin(a) * np.sin(b) * np.sin(c - d)
    return A

def func2(a, b, c, d):
    s = np.sin(c - d)
    A = 0.5*((1 - s)*np.cos(a - b) + (1 + s)*np.cos(a + b))
    return A

和命令行:

$ pythran test.py  # Default compilation
$ pythran test.py -march=native -DUSE_BOOST_SIMD  # Pythran with code vectorization

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM