タグ

pythonとprofilingに関するpipeheadのブックマーク (13)

  • Pythonにおけるプロファイリング ― コードの高速化のために | POSTD

    ここHumanGeo社ではPythonを使うことが多く、それは極上の楽しみでもあります。美しく機能的なコードを短時間で記述するのにPythonはうってつけで、私個人にとっても一押しの言語です。仕事に限らずプライベートでも使っています。そんな素晴らしいPythonですが、欠点がないわけではありません。それはあまりにも遅いことです。幸いPythonには、コードをプロファイリングするための優れたツールがいくつかあるので、コードの美しさと速さを共存させることができます。 HumanGeoで働き出した頃、実行に長時間を要すプログラムのボトルネックを探り、何とかしてそれを速くさせるという仕事を担当しました。その内容は、 cProfile や PyCallGraph ( ソース )、はたまたPyPy(高速なPython用代替インタプリタ)などの各種ツールを使って、プログラムを最適化するためのベストな方法

    Pythonにおけるプロファイリング ― コードの高速化のために | POSTD
    pipehead
    pipehead 2015/08/20
    http://blog.thehumangeo.com/2015/07/28/profiling-in-python/ の和訳; cProfile, PyCallGraph; ボトルネック解消の手引き
  • Pythonスクリプトのパフォーマンス計測ガイド | Yakst

    Pythonスクリプトの速度を計測し、そのボトルネックを探る。さらに、メモリ使用量、メモリリークの原因特定までの調査方法を解説する。 あなたが書いたすべてのPythonプログラムで厳密なパフォーマンス計測が必要になるというわけではないにせよ、その時が来たら、役に立ってくれる様々な種類のツールがPythonのエコシステムにはあるのだということを知っておけば安心できるだろう。 プログラムのパフォーマンスを計測することは、すなわち以下の4つの基的な質問に答えることだと要約できる。 どのくらい高速に実行できるか? スピードのボトルネックはどこか? どのくらいのメモリを使うか? メモリリークしているのはどこか? これから、いくつかの素晴らしいツールを使ってこれらの質問に答えていくための詳細を見ていこう。 大ざっぱな実行時間 素早くざっくりとコードの実行時間を計るのに、古き良きUNIXのユーティリテ

    Pythonスクリプトのパフォーマンス計測ガイド | Yakst
    pipehead
    pipehead 2013/09/06
    https://www.huyng.com/posts/python-performance-analysis の和訳; time(1), コンテキストマネージャ, line_profiler, memory_profiler, objgraph
  • Pythonコードのプロファイリング - shkh's blog

    普段、Pythonのコードは何となく速かろうという、言ってみれば勘で書いているのだけど、その勘とやらは往々にしてウンコードを生むものである。そこで、プロファイラを使っていきたいと思う。 使えそうなツール そういうわけで、いくつか使えそうなツールをリストアップした。 経過時間のプロファイラ ツール名 メモ profile ビルトイン, ピュアPythonの決定論的プロファイラ cProfile ビルトイン, C拡張の決定論的プロファイラ line_profiler 行単位の決定論的プロファイラ Plop 統計的プロファイラ, Dropboxの人が作ってる statprof 統計的プロファイラ, 開発停止? yep 拡張モジュール用の統計的プロファイラ, バックエンドにgoogle-perftools メモリのプロファイラ ツール名 メモ memory_profiler 行単位でメモリ消費量の

    Pythonコードのプロファイリング - shkh's blog
    pipehead
    pipehead 2013/08/16
    profile, cProfile, line_profiler, Plop, statprof, yep, memory_profiler, Heapy, Pympler; 方法論: 決定論的プロファイリング, 統計的プロファイリング; 粒度: マクロ・プロファイリング, マイクロ・プロファイリング
  • pythonのcProfileを使ってみる。 - malibu-bulldogの日記

    python専用のプロファイラー,cProfileを使ってみました。 プロファイラーって? 実行されているプログラムの処理のいろんなものを測定してくれる開発ツールの事をさします。 多くの開発者はプロファイラーを使って関数単位で処理時間を測定してプログラムのボトルネックを探します。 C言語でLinux環境な人なんかはプロファイラーとしてvalgrindにcallgrindをのっけて測定とかよくやってますね。 とはいえ開発しているターゲットや開発環境によってはプロファイラーが無い,あっても使えない場合もありますが… cProfileとは? python用のプロファイラーです。 MacOSX等はXCodeを入れればこれらもインストールされるでしょう(多分,気づいたら入ってました!)。 Ubuntu10.04だと素の状態では入っていないので sudo apt-get install python-

    pythonのcProfileを使ってみる。 - malibu-bulldogの日記
  • Python文字列バッファいろいろ  〜一番速い奴連れてこいシリーズ〜  - HDEラボ

    Pythonの文字列は、Java等と同様にImmutableであり、頻繁に文字列を操作する場合においては、気をつけないと思わぬパフォーマンスの低下を招きます。 代表的なケースとしては、文字列に新たな文字列をどんどん連結していくケース。 s = s + "新たな文字列1" s = s + "新たな文字列2" s = s + "新たな文字列3" . . . . . . とせずに、配列を使って、 L = [] L.append("新たな文字列1") L.append("新たな文字列2") L.append("新たな文字列3") . . . . . . s = ''.join(L) とするのが定石イディオムとされています(最初の例では、毎回新たな文字列が生成されるオーバーヘッドがあるとされる。参考:「Pythonクックブック」)。 これは当に正しいのでしょうか。また、mutable文字列っぽいア

    pipehead
    pipehead 2009/02/17
    > Python 2.4からは、A = A + B形式の文字列連結は最適化がなされているようです。ただし、大変残念なお知らせが一つ...これらの最適化処理は、Python 2.6現在、unicode型については行われていないようです
  • 文字列結合のパフォーマンス - プログラミング日記

    Efficient String Concatenation in Python (http://www.skymind.com/~ocrow/python_string/) 2.5.2でテスト。 import time def profile(func): def foo(*a, **k): t = time.time() r = func(*a, **k) print '%s: %g sec elapsed' % (func.__name__, time.time() - t) return r return foo @profile def method1(): out_str = '' for num in xrange(loop_count): out_str += `num` return out_str @profile def method2(): from UserStr

    文字列結合のパフォーマンス - プログラミング日記
  • Python でメソッドの実行時間の計測

    1. timeit モジュールでコードの実行時間を計測する Python で大雑把にコードの実行時間を知りたい場合、datatime オブジェクトを利用する。 Python のコードを実行するとき、バックグラウンドで実行されているプロセスがある。正確なメソッドの実行時間を測定するには、datetime はなく、timeit モジュール を使う必要がある。 18.2. Using the timeit Module によると、 Before you start your timing tests, turn everything off and disconnect from the network. Then turn off all the things you forgot to turn off the first time, then turn off the service th

    pipehead
    pipehead 2008/10/07
    timeit モジュール
  • 2007-12-30

    モジュールを少し勉強した。 module Trig PI = 3.141592654 def Trig.sin(x) # .. end end requre 'trig' y = Trig.sin(Trig::PI/4) reqireで文字列で渡すのはまあ良いとして、定数アクセスの"::"と、メソッドアクセスの"."を区別しているのは気に入らない。reqireした際に変数は取り込まれないのも覚えるのが大変そう。メソッド定義で"Trig."を付けるのが面倒など色々不満が出た。もう少し使い込んでみないとそうすべき理由が見えない。 minxinの説明で、include Enumerableして、eachメソッドを定義すれば、map、include?、find_all?、injectなどが普通に使えるようになるのは良さそうに感じた。 あと、Rubyはビルトインクラスの挙動をプログラム全体で変更でき

    2007-12-30
    pipehead
    pipehead 2007/12/30
    timeit モジュール
  • Pythonでdocstringを書くとちょっとパフォーマンスが落ちる件

    昔からそうだったんだけど、Python2.5の今になってもこの件はかわってない みたいだ。 #!/usr/bin/python # _*_ coding: euc_jp _*_ def withoutdoc(n): return n def withdoc(n): """ここにすごおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおく丁寧なドキュメントを たーーーーーーーーーーーーーーーーーーーーーーーーっぷり書きます。""" return n if __name__=='__main__': from timeit import Timer t = Timer("withoutdoc(1)", "from __main__ import withoutdoc") print t.timeit() t = Timer("withdoc(1)", "from __mai

  • 西尾泰和のブログ @ Cybozu Labs: Python2.4以降での高速なソート

    どうも、ご無沙汰です。 このブログをはじめた当初は「1日1エントリー公開しよう」 などともくろんでいたのですが、はやくも2週間以上間が空いてしまいました。 今回の話はCPythonにバージョン2.4から追加された機能についてです。 みなさんは、例えば「タプルの入ったリストを、そのタプルの2番目の要素でソートしたい」とか 「Entryオブジェクトのリストを、その属性updateTimeの値に従ってソートしたい」という場合、 どうしていますか? まずは2.3以前から可能だった 「sortメソッドに比較用の関数を渡す方法」の実行にかかる時間を調べてみます。 # sortメソッドに比較用の関数を渡す方法 d.sort(lambda x, y: cmp(x[1], y[1])) 実行時間の測定にはtimeitモジュールを使います。 (10.10 timeit -- 小さなコード断片の実行時間計測)

  • エンコーディング変換の高速化 - odz buffer

    ref:404 Blog Not Found:perl tips - Encodeを速く使う方法 当然の話だけど、対象の文字列が長くなると、Encode::encode も、$e->encode も大差ない。 ちょっといじって試してみる。 use strict; use warnings; use Benchmark qw/cmpthese timethese/; use utf8; use Encode; use Jcode; use Unicode::Japanese; use Smart::Comments; my $str = join '', ( 'a' .. 'z', ( map { chr } ord('ぁ') .. ord('ん') ) ); $str = $str x shift if @ARGV; my $bytes = encode_utf8($str); my $u

    エンコーディング変換の高速化 - odz buffer
  • Unicodeオブジェクトへの変換コスト - odz buffer

    unicode(s, enc) より s.decode(enc) が早くて decoder(s)[0] は もっと早いという話を聞いたので試してみた。 #!/usr/bin/env python # coding: cp932 from timeit import Timer import codecs decoder = codecs.getdecoder('cp932') setup = 'from __main__ import decoder' print Timer("unicode('日語', 'cp932')", setup).timeit() print Timer("'日語'.decode('cp932')", setup).timeit() print Timer("decoder('日語')[0]", setup).timeit() 結果 2.018347583

    Unicodeオブジェクトへの変換コスト - odz buffer
  • その演算って遅くない?

    常日頃より「Pythonは遅い」と言われているわけですが、コードの書き方によってもずいぶん速度が異なるものです。 ここでは、私が実際に仕事で使っていて気づいたことを書きます。 浮動小数点数の2乗編 以下のコードを実行してみてください。 import time import math N = 1000000 a = math.pi def aa(): start = time.time() for i in xrange(N): a ** 2 t = time.time() - start print 'aa: Time= %f\n' % t return t def bb(): start = time.time() for i in xrange(N): a * a t = time.time() - start print 'bb: Time= %f\n' % t return t d

  • 1