2017-05-31 61 views
0

在Cython中,我試圖從具有10列的Cassandra表中獲取約600000行。然後我會遍歷所有這些。對於性能測試的目的,在這裏我已經在做read.pyx通過Cassandra的選擇ResultSet改進for-loop

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-loop,將結果導入到DataFrame中,並改進通過DataFrame的迭代。但是將它們混合在一起會使代碼運行~25s

有沒有其他方法可以改善這個數字?查詢應保持不變。

任何建議表示讚賞。

+0

爲什麼查詢需要保持不變?你需要來自所有10列的數據? – etemple1

+0

正如我所說的,我只是測試for循環的性能,所以在這裏我只做一個簡單的操作。稍後,我可以使用其他列進行分析。所以不要介意查詢。如果你真的需要知道,當我獲取一列時,需要大約6秒鐘的時間。 –

+0

不是Cython特有的,但我會試圖通過調用一次帶有可迭代的'max(i.volume for i in rows)'調用max來最小化調用。或者更好,但獲得與SQL的最大可能? – DavidW

回答

0

如果您想要提高拋出600k行的性能 - 嘗試使用批處理/分段處理,異步調用,分頁等工作 - 您可以使用所有工具並行運行並提高性能。

如果你想提高這個特定「循環」的性能,我不確定有很多事情要做 - 大部分時間應該是所有I/O部分。您可以覆蓋行工廠,使用壓縮進行傳輸,使用CL_ONE。另外,如果您想選擇「max」或其他類型的聚合,您可以嘗試將邏輯移至Cassandra並使用UDF的/ UDA。