できるだけ早く、Pythonでオブジェクトのリストを更新したいと思います。私が今やっているが、次のコードで実証される:私の更新()関数のforループオブジェクトのリストを更新するループを高速化
from bokeh.models.sources import ColumnDataSource
from random import randint
n = 10
m = 50
sources = []
for i in range(n):
# all list elements have similar structure
sources.append(ColumnDataSource(data=dict(x=range(m), y=range(m), count=[0])))
def some_function():
# do some computation
return [randint(0, m) for i in xrange(n)]
def update():
# this function is called every 20ms
for s in sources:
s.data = dict(x=some_function(), y=s.data['y'], count=[s.data['count'][0]+1])
ザ・は時間がかかりすぎます。私は更新するリストがたくさんあり、関数は20ミリ秒ごとに呼び出されます。場合によってはupdate()関数の実行に20ms以上かかることがあります。
私の現在の研究では、リストの補完はforループよりもはるかに高速ですが、私の場合は使用できません。のような:
#not working code
sources = [dict(x=.., y=.., count=..) for s.data in sources]
リストの補完は高速ですが、たいていの場合、ほとんどの場合はμsecです。彼らは20ミリ秒の遅延を修正することはありません(そして、 'update 'の速度にはまったく影響がないでしょう、'ソースの初期構造のみ)。あなたは 'some_function'で何をしていますか?これは合理的に20ミリ秒以上かかる可能性のある唯一のものです。 – ShadowRanger
私はこれを答えとして書いていますが、私はそれが完全であるとは思えません。プロフィール。はい、ループは遅いですが、それはほとんどの場合、あなたを減速させるものではありません。プロファイルの例については、http://stackoverflow.com/questions/582336/how-can-you-profile-a-python-scriptを参照してください。 – user2699
それはまた言及する価値がある。 Bokehサーバーの目的は、Pythonプロセスを、ネットワーク上のアプリケーションのブラウザビューと自動的に同期させることです。 's.data = ... 'を設定すると、ブラウザのデータソースビューを更新するために* network communication *がトリガされます。あなたの質問から、20msの見積もりでネットワークアップデートの時間を含めるか除外したかは明らかではありません。 – bigreddot