Cythonでは、10個のカラムを持つCassandraテーブルから約600000の行をフェッチしようとしています。それから、私はすべてを繰り返します。テストのパフォーマンスのために、ここで私はread.pyx
に何をやった:forループ9.449406862258911s
での撮影Cassandraのselect ResultSetを使ってforループを改善する
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
時間を。この数は純粋なPythonのバージョンとあまり変わりません。
また、私はPandas DataFrameの形で結果を得ようとしましたが、悪化するだけです。多くの情報源がfor-loopの改善方法を紹介し、SELECT
の結果をDataFrameに取り込み、DataFrameを通して反復処理を改善しています。しかしそれらを混在させると、コードは~25s
になります。
この番号を改善する他の方法はありますか?クエリは変更しないでください。
ご迷惑をおかけして申し訳ございません。
なぜクエリを変更しないでおく必要がありますか? 10列すべてのデータが必要ですか? – etemple1
私が言ったように、私はforループのパフォーマンスをテストしているので、ここでは単純に1つの列で操作します。後で、分析に他の列を使用することがあります。だからクエリを気にしないでください。もしあなたが本当に知っている必要があれば、私は1つの列をフェッチするときに '〜6秒'を要します。 –
Cython固有ではありませんが、私はiterable 'max(i行のi.volume)で一度呼び出すことで、maxへの呼び出しを最小限に抑えたいと思うでしょう。それとも、SQLでおそらく最大限になるのでしょうか? – DavidW