モノではなくお金を貯める。2016/06/19最近、アルゴリズムの勉強をしようと「プログラマ脳を鍛える数学パズル」という本をやっています。CodeIQの「今週の問題」というコーナーの出題を集めたものです。12:04時点)Amazonで購入ついでにCodeIQにも登録して、最新の今週の問題も平行してやり始めたのですが、ある問題をpythonで再帰を使って解いたところ、高々10万回程度の計算なのに実行時間が数十秒かかるようになってしまいました。再帰しているメソッドに渡している、2次元配列をdeepcopyしているのが原因だったようです。そもそも2次元配列を再帰で渡さないといけないルゴリズムがよくない気もしますが、あまりに遅くてびっくりしたので、ちょっと速度を計ってみました。copy)はarr[:]といったスライス操作で行います。2次元配列をただコピーすると、中身が一緒の配列になってしまいますが、copy.deepcopyを使うと中身までちゃんとコピーしてくれます。問題で使っていたのは5*3のbooleanの2次元配列です。arr]の3つを10万回やった場合の速度を計ってみました。2.7)i)2.29ii)0.02iii)0.08うわっ...pythonのdeepcopy、遅過ぎ...?なんとdeepcopyだと同じサイズの1次元配列のコピーの100倍遅くなりました。メモリが連続してないので、1次元配列と比べて2次元配列のコピーが遅くなるのは当然ですが、手動コピーと比べても遅すぎですね。3.5)python3でもやってみました。i)2.5700000000000003ii)0.009999999999999787iii)0.11000000000000032うわっ...python3のdeepcopy、遅過ぎ...?だいたい似たようなかんじです。再帰ループを引き起こします。コピーするため、例えば複数のコピー間で共有されるべき管理データ構造までも、余分にコピーしてしまいます。ユーザ定義のクラスでコピー操作やコピーされる内容の集合を上書きできるようにします。deepcopyで問題を起こさないよう色々やってて遅くなってるということでしょうか。(適当)高々2次元配列程度に使うのはオーバースペックなのかもしれません。rubyの場合せっかくなのでrubyでもやってみました。rubyでdeepcopyをする場合は、一度シリアライズして戻すというのが一般的なようです。0.201839)iii)の手動コピーよりは遅いですが、まあリーズナブルな結果ではないでしょうか。してpythonでもシリアライズしてもどした方が、早いんじゃなかろうか?まとめpythonのdeepcopyはかなり遅いので反復して使うのは避けた方がよい。2次元配列程度をコピーしたい場合は手動でコピーした方が10倍以上早い。コメントをキャンセルメールアドレスが公開されることはありません。コメント名前メールアドレスウェブサイト上に表示された文字を入力してください。...Woman&Crowdウーマンクラウドが倒産?サービス終了で閉鎖されるなんて。いえば、久々にWoman&Crowdでも。...雑巾を使わない、という選択。使い捨て便利掃除グッズに移行。...レディース向けの可愛い人気サブバッグ(結婚式や通勤で使える)が好き♡あると便利、ないと困るサブバッグ。...公立幼稚園のママ&子どもの面接服装って?地域によっては、幼稚園or保育園の入園準備が始まるころですね。...東京都内に安いタクシー会社(迎車料金無料or深夜割増なし)があったよ我が家はマイカーを持ってません。分岐水栓がつかなくても工事不要!食洗機(食器洗い乾燥機)を設置する方法をまとめています。...レゴマット&バッグを簡単に手作りした《100均利用・ミシン不要》おくるみをリメイクしてレゴマット&バッグを手作りする方法をご紹介しています。分岐水栓がつかなくても工事不要!あやさん、コメントありがとうございます。分岐水栓がつかなくても工事不要!こんばんは。ふるさと納税の限度額を自分で計算【2017年対応】コメントありがとうございます。ふるさと納税の限度額を自分で計算【2017年対応】こんにちは。興味があって、参考に読ませていただきました。モノではなくお金を貯める。