C, cython和pandas dataframe交互int64, int32的选择
cython调用C代码的一个错误 expected 'int' but got 'long',原因不复杂,C code的int为32bit, 而pandas df缺省为np.int64 (64bit),有个参数传递了数组,指针类型就不符了。
两个解决方案
- C代码里面所有相关的int改为long long类型
或者 - 使用pandas dataframe前转换为np.int32, 即df.astype(np.int32)
性能比较:
64位的机器上全部都跑64位的整数速度更快一点,但耗内存多一点。
操作主要是循环比较,全部用64bit整型耗时大概是第2种方法的85%左右,其中第2种方法包括了类型转换的时间。
如果把int64转为int32这一步排除,全部在64bit上计算仍然性能占优,大约是第二种方法的87%.
测试环境:i7-12700 CPU, Ubuntu 5.15.0-69-generic 20.04.1 LTS