速度計測シリーズ
はじめに この記事は「Pythonおっせーよ」と思っている、そこのあなたのためのものです。 PythonはLLなので遅いです。その分、楽に書けるし、動的型付けでダイナミックなことができて「楽しぃぃいい」のですが、それでも遅くて困るときがあります。特に数値…
はじめに mecab-pythonで形態素解析を行って何らかの処理をするとき、特定の品詞だけ取り出したいということがよくあります。 そういう目的で書かれたコードとして、よくこんなものを見たりすると思います。 import MeCab tagger = MeCab.Tagger() tagger.pa…
概要 複数のiterable(リストとか)を結合させてループさせたいときがあります。 >>> lst1 = [1, 2, 3] >>> lst2 = [4, 5, 6] >>> # 1, 2, 3, 4, 5, 6というループをやりたい 連結すればできたりしますが、余計なメモリを確保するのでスマートではないし、パ…
はじめに 俗に言う「二次元配列」をpythonで表現しようとすると、listのlistで書くというのが一番最初に思いつくやり方だと思います。 速度のこととか考えるとどうやるのがいいのか? ということは実はあまり知らなかったので、この際いろいろ試してみます。…
はじめに 正則化回帰は割と定番のモデルなのですが、sklearnのAPIリファレンスをよく見ると、CVが末尾についたモデルがあることがわかります。 Lasso→LassoCV Ridge→RidgeCV ElasticNet→ElasticNetCV API Reference — scikit-learn 0.21.2 documentation な…
はじめに 疎行列はメモリ消費こそ少ないものの、scikit-learnで使うと内部でnumpy配列に変換されたりしてあまり恩恵を受けられないことが多いです。 でも、変数選択に使うときはどうやら効くっぽいです。 関連記事 scikit learnのモデルに疎行列(csr_matrix…
はじめに 表題の通りなのですが、サンプル数が多いデータに対してランダムフォレストを使うと思いの外メモリを食います。 また、ストレージにダンプしようとすると、ストレージ容量も消費します。 現象 なにはともあれやってみましょう。 import pickle from…
はじめに sklearnのモデルには疎行列を取れるものもたくさんありますが、この場合速度差があったりするのでしょうか。 いろいろなデータとモデルで検証を行ってみました。 目次 はじめに 実験1:digitsを分類させてみる 実験2:多項ナイーブベイズについても…
概要 __slots__を使うとメモリをケチれるという話はよく見かけますが、属性アクセスの速度については話を聞かないので調べてみました。 実験コード import timeit class A_slots: __slots__ = ["a"] def __init__(self): self.a = 42 class A_attr: def __in…
numpy.searchsortedを使うとnumpyでソート済み配列に対するバイナリサーチ(二分探索)を行えます。numpy.searchsorted — NumPy v1.16 Manual ただし、1次元配列しか受け付けません。まあ、いいか。 次のように使えます。 >>> import numpy as np >>> a = np…
はじめに concurrent.futures.ProcessPoolExecutorは便利そうなので、Poolの代わりに使ってみようと思います。17.2. multiprocessing — プロセスベースの並列処理 — Python 3.6.5 ドキュメント 17.4. concurrent.futures – 並列タスク実行 — Python 3.6.5 ド…
はじめに numpy配列を直列化する方法はいろいろあります。numpyから使える方法に限っても4つあります*1。numpy.savetxt — NumPy v1.15 Manual numpy.save — NumPy v1.15 Manual numpy.savez — NumPy v1.15 Manual numpy.savez_compressed — NumPy v1.15 Manu…
概要 ライフゲームを書きました。 素のpythonだと何をやっても激遅だったので、numbaで高速化しました。 方針 まず実装の方針を決めます。主要な関数としては以下のものがあればできると思いました。 update_cell 1セルの状態を更新する update_field フィー…
はじめに 今日コードを書いていて、rangeでもinが使えることに気づきました。 >>> 10 in range(20) True ドキュメントを見るとシーケンス型としての機能は一通り備えているようです。 range オブジェクトは collections.abc.Sequence ABC を実装し、包含判定…
はじめに pythonではC言語の動的リンク/共有ライブラリを手軽に扱う方法として、ctypesという標準モジュールが用意されています。ctypes --- Pythonのための外部関数ライブラリ — Python 3.7.4 ドキュメント ctypesを用いて自作したC言語の処理を呼び出すこ…
はじめに 機械学習でパラメータ・チューニングをしたい場合、グリッドサーチを行うのが定石とされています。sklearnではグリッドサーチはGridSearchCVで行うことができます。sklearn.model_selection.GridSearchCV — scikit-learn 0.21.2 documentation それ…
タイトルの通りのものが必要になりました。一体どう書くのでしょう? とりあえず反転させる >>> lst = list(range(20)) >>> lst[::-1] [19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] ま、これは常識(python廃人の皆さんには)。…
べき乗はxのn乗、べき根はxのn乗根です。では、pythonではどう書くのでしょうか。 2乗とかsqrtくらいはわかっても、n乗根あたりになるとすぐ出てこないという人も多いのでは? そこで、説明を書きます。
はじめに この記事を開いた人の大半は「itemgetter? なにそれ」という反応でしょう。 (いや、検索で来た人はそうでもないかもしれないけど) itemgetterは以下のように使えるものです。 >>> lst = list(zip([1,3,5,6,7,1,4], [3,4,1,0,8,5,2])) # 特に値に…
numpyで行列演算を行う方法としては、普通のnumpy配列に行列演算系の関数を適用していく方法と、あまり知られていないがnp.matrix型やnp.mat型を使う方法がある。 速度が違ったりするのだろうか? 仮に違うと困る(というか場面によって適切な方を選ぶ必要が…
やりたいこと input:[0,1,0,0] output:4 極めて単純明快ですが、やるだけなら簡単なので速度を測ります。 さらに、pure pythonでやると遅いことが目に見えているのでcythonで高速にしようというネタです。 pure pythonで書いたプログラム 素晴らしいことに(…
こういう処理がしたいときがある。 i = 2049 lst = [] while i > 0: lst.append(i%10) i //= 10 # 必須 lst.reverse() print(lst) # 結果-> [2, 0, 4, 9] 「もうできたじゃん」という意見もあると思うが、C言語のコードみたいでいかにもpythonicじゃない。 …
記事の概要 素朴な疑問:「in演算子は遅いのか?」 速度を実測して検証しました。 目次 記事の概要 はじめに 検証 結果 結論 スポンサーリンク (adsbygoogle = window.adsbygoogle || []).push({}); はじめに inの速度は謎である。とりあえず、なんとなく速…
SelectKBestはsklearnの簡単に特徴選択ができるクラスです。ざっくりと特徴選択したいときに、とても便利です。sklearn.feature_selection.SelectKBest — scikit-learn 0.20.1 documentation ところで、このSelectKBestにはscore_funcというパラメータを指定…
pythonで複数の辞書をマージするにはどうしたらいいのでしょうか。forループ? 辞書内包表記を使う? updateメソッド? 実は、ChainMapというものもあります。実は、ChainMapというものもあります。実は、ChainMapというものもあります。その使い方について…
sklearnのPCA(主成分分析)がやたら遅くて腹が立ちました。計算コストを下げるために次元削減してるのに、次元削減で計算コスト食ったら意味がありません。 とにかくこのPCAを高速化したかったので、svd_solverを変えてどうなるか試しました。なお、腹が立…
pickleが遅くて困った経験、ありませんか? 私はありませんが、実際問題としてpickleの速度ってちょっと気になりますよね。 という訳で、測ってみました。 # coding: UTF-8 import sys import pickle import time import numpy as np for obj_size in [10,50…
はじめに 前回の記事で「なんとなくnp.float32が速い気がする」とか書いたので、実際に測ってみる。 予め断っておくと、計算速度なんて環境によって違うし、どの型が速いかもCPUのアーキテクチャに依存する。numpyはバリバリにSIMD命令を使って最適化する(…