2015-05-12 123 views
0

任何人都可以幫助我演示如何將此循環轉換爲cython以提高性能。我得到你需要使用cdef創建靜態類型的性能,但還有什麼是必需的:Cythonise熊貓循環

如果我有一個數據幀df列'a'。

for i in range(0, len(df.a)-1): 
    if (i < len(df.a)-1): 
     y= i + 1 
     while ((np.abs(df.a[y]- df.a[i]) <= 0.015) & (y < len(df.a)-1)): 
      y = y + 1 
     if df[a][y] - df[a][i] >= 0.015: 
      df['dir_y'][i] = 1 
      #print(1) 
     else: 
      df['dir_y'][i] = -1 
      #print(-1) 

我很確定'cythonise'不是一個詞,它只是看起來合適。

+2

或許你可以先看看'.iloc'和'.ix',優化現有的代碼,配置文件,然後再決定是否需要移動到*用Cython *? – Anzel

+1

另請參閱關於使用cython進行擴展的pandas文檔:http://pandas.pydata.org/pandas-docs/stable/enhancingperf.html#cython-writing-c-extensions-for-pandas – joris

+0

Anzel能爲您闡述原因。 iloc和.ix會更快。我以爲.ix比我寫的要慢 – azuric

回答

1

沒有試圖去評論你是否可以在熊貓這個寫的更好,而不使用用Cython(我不知道,但它肯定是值得嘗試的),你需要做的步驟是:

  1. cdef迭代指數iy爲整數:cdef int i,y(在cdefs在他們所在的函數的頂部去)
  2. cdef一個memoryview陣列通過訪問df.a/df['a']cdef double[:] df_a_mv後來df_a_mv = df.a(我在猜這裏的類型,但我T的可能是雙)
  3. 替換所有df.a與memoryview(df_a_mv
  4. 編譯用Cython(見http://docs.cython.org/src/reference/compilation.html

你可能也想運行cython -a <your_file>.pyx,看看它做了什麼 - 它產生HTML文件和以黃色突出顯示的行是未優化的位。

我不會擔心df['dir_y'][i] - 它很少進行,你可能無法加速太多。

作爲最後一個小點:if (i < len(df.a)-1):是不必要的 - 它由周圍的for循環保證。