在Cython中,我试图从一个有10列的Cassandra表中获取大约600000行。然后我将遍历所有这些。为了测试性能,我在read.pyx
:
from cassandra.cluster import Cluster
import pandas as pd
import time
cpdef int get_max_volume():
cluster = Cluster()
session = cluster.connect()
session.execute("USE trading")
rows = session.execute("SELECT * FROM fx WHERE ins='EURUSD' limit 600000")
max_vol = 0
start = time.time()
for i in rows:
max_vol = max(max_vol, i.volume)
print(max_vol)
print(time.time() - start)
return max_vol
for循环的时间是9.449406862258911s
。这个数字与纯Python版本没什么不同。
我也尝试通过Pandas DataFrame的形式获得结果,但它变得更糟。许多来源指导我如何改进for循环,将SELECT
结果导入DataFrame,并改进迭代DataFrame。但是将它们混合在一起会使代码运行~25s
。
还有其他方法可以改善这个数字吗?查询应保持不变。
任何建议都表示赞赏。
答案 0 :(得分:0)
如果你想提高抛出600k行的性能 - 尝试使用批处理/分组,异步调用,分页等... - 你可以使用所有工具并行运行它并提高性能。
如果你想提高这个特定“循环”的性能,我不确定还有很多工作要做 - 大部分时间应该是所有的I / O部分。您可以覆盖行工厂,使用压缩进行传输,使用CL_ONE。
此外,如果您想选择“max”或其他类型的聚合,您可以尝试将逻辑移至Cassandra并使用UDF / UDA。