Cythonise 一个 pandas 循环
Cythonise a pandas loop
任何人都可以帮助我展示如何将此循环转换为 cython 以提高性能。我知道您需要使用 cdef 创建静态类型以提高性能,但还需要什么:
如果我有一个包含列 'a' 的数据框 df。
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' 不是一个看起来很合适的词。
如果不尝试评论您是否可以在不使用 Cython 的情况下在 Pandas 中写得更好(我不知道,但它肯定值得尝试),您需要执行的步骤是:
cdef
迭代索引 i
和 y
作为整数:cdef int i,y
(cdef 位于它们所在函数的顶部)
cdef
一个 memoryview 数组来访问 df.a
/df['a']
通过: cdef double[:] df_a_mv
然后稍后 df_a_mv = df.a
(我已经猜到了这里的类型,但它可能是两倍)
- 用你的记忆视图(
df_a_mv
)替换你所有的df.a
- 在 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
循环保证。
任何人都可以帮助我展示如何将此循环转换为 cython 以提高性能。我知道您需要使用 cdef 创建静态类型以提高性能,但还需要什么:
如果我有一个包含列 'a' 的数据框 df。
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' 不是一个看起来很合适的词。
如果不尝试评论您是否可以在不使用 Cython 的情况下在 Pandas 中写得更好(我不知道,但它肯定值得尝试),您需要执行的步骤是:
cdef
迭代索引i
和y
作为整数:cdef int i,y
(cdef 位于它们所在函数的顶部)cdef
一个 memoryview 数组来访问df.a
/df['a']
通过:cdef double[:] df_a_mv
然后稍后df_a_mv = df.a
(我已经猜到了这里的类型,但它可能是两倍)- 用你的记忆视图(
df_a_mv
)替换你所有的df.a
- 在 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
循环保证。