<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      cython并行性能-計算滾動求和 rolling function

      cython通過編譯為C程序提高性能有很多例子,通過OpenMP并行的性能沒那么多。
      今天嘗試了一下似乎gcc對parallelism reduction優化的很厲害,加上OpenMP并行可以提高20倍性能(相對于pandas rolling),這不是簡單的2 core帶來的性能提高。

      滾動求和 rolling sum的例子
      最簡單的實現pandas.rolling,通過操作numpy array,速度也還算能接受。

      # test_para.py
      import numpy as np
      #import pyximport; pyximport.install(reload_support=True, setup_args={"include_dirs":np.get_include()})
      import timeit
      import pandas as pd 
      import para.cpara as cpara
      
      X = -1 + 2*np.random.rand(100000) 
      ss = pd.Series(X)
      ss.rolling(100).apply(np.sum,raw=True)
      
      print('==============')
      print('multi thread')
      start_time = timeit.default_timer()
      sum_cython=pd.Series(cpara.window_sum(X, 100))
      print(timeit.default_timer() - start_time)
      
      print('single thread')
      start_time = timeit.default_timer()
      sum_pandas=ss.rolling(100).apply(np.sum,raw=True)
      print(timeit.default_timer() - start_time)
      print(np.max(np.abs(sum_cython - sum_pandas)))
      

      cython源文件

      # cpara.pyx
      cimport cython
      import numpy as np
      from cython.parallel import prange,parallel
      cimport numpy as cnp
      from libc.stdlib cimport malloc
      
      @cython.boundscheck(False)
      def window_sum(cnp.ndarray[double, ndim=1] arr, int window):
          cdef h = np.zeros_like(arr)
          cdef int imax = arr.shape[0]
          cdef double *buffer = <double *>malloc(imax * sizeof(double))
          cdef double result = 0.0
          cdef int i, j
          with nogil, parallel():
              for i in prange(imax, schedule='dynamic'):
                  buffer[i] = 0.0
                  if i >= window-1:
                      for j in range(window):
                          buffer[i] += arr[i-j]
          
          for i in range(imax):
              if i < window -1:
                  h[i] = np.nan
              else:
                  h[i] = buffer[i]
          
          return h
      

      setup.py中要加入openmp的編譯鏈接參數

      EXT = Extension("*",
                      ["para/*.pyx"],
                      define_macros=[('CYTHON_TRACE', CYTHON_DEBUG),
                                     ('CYTHON_TRACE_NOGIL', CYTHON_DEBUG),
                                     ('CYTHON_BINDING', CYTHON_DEBUG),
                                     ("NPY_NO_DEPRECATED_API", "NPY_1_7_API_VERSION"),
                                     ('CYTHON_FAST_PYCCALL', '1')],
                      extra_compile_args = ["-fopenmp" ],
                      extra_link_args=['-fopenmp'],
                      include_dirs=[".", np.get_include()])
      

      性能比較

      %timeit pd.Series(cpara.window_sum(X, 100))
      23.4 ms ± 325 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
      
      %timeit ss.rolling(100).apply(np.sum,raw=True)
      536 ms ± 3.96 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
      

      536/23.4=22.9

      測試環境:i3-7100U 2core 2T CPU, ubuntu 18.04 LTS

      posted @ 2020-10-14 12:56  daidau  閱讀(576)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 大地资源高清免费观看| 亚洲综合色网一区二区三区| 尹人香蕉久久99天天拍欧美p7| 婷婷久久香蕉五月综合加勒比| AV无码免费不卡在线观看| 色吊丝一区二区中文字幕| 天堂v亚洲国产v第一次| 国内精品久久黄色三级乱| 国产精品中文第一字幕| 日本一道一区二区视频| 成人亚洲欧美一区二区三区| 国产精品午夜福利91| 亚洲成av人片在www鸭子| 久久天堂综合亚洲伊人HD妓女 | 91无码人妻精品一区| 综合久久婷婷综合久久| 午夜福利你懂的在线观看| 亚洲精品国产字幕久久麻豆| 国产成人午夜精品影院| 国产精品高清视亚洲中文| 97在线视频人妻无码| 激情综合网激情五月伊人| 黄色三级亚洲男人的天堂| 久久国产精品波多野结衣av| 国产亚洲精品在av| 婷婷综合久久狠狠色成人网| 美乳丰满人妻无码视频| 九九热在线视频免费观看| 波多野结衣久久一区二区| 久久亚洲国产品一区二区| 女人腿张开让男人桶爽 | 欧美人伦禁忌dvd放荡欲情| 久国产精品韩国三级视频| 中文字幕av无码不卡| 中国女人大白屁股ass| 天天做天天爱夜夜爽导航| 亚洲综合无码一区二区| 国产初高中生粉嫩无套第一次| 亚洲一区二区精品极品| 亚洲嫩模喷白浆在线观看| 国产乱码精品一区二区麻豆|