2015-05-12 100 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循环保证。