pythonでfor文を使わないってどういうこと?

こんばんわ。python永遠に初心者の僕です。
pythonはfor文が遅いから使わないようにした方がいい...

何度今まで聞いたことでしょう。
しかし調べても、あまりまとまったサイトがないようなので、自分のためにまとめてみます。
まずはリスト(配列。dataとする) からの検索です。
リストであるlistから"mokuteki"が入っている場所を探します。

1. listのindex
実は以前調べていました。
http://nahareport.blogspot.jp/2015/11/for.html

data.index("mokuteki")

で検索できます。


2. bisect
bisectを使うにはlistがソートされている必要があるようです。
ソートはリスト標準の

data.sort

はマージソートで、かつ下手に自分で書くよりは早いようですのでこれを使いましょう。
でbisectの使い方はこんな感じ。

import bisect as bisect
bisect.bisect_left(data, "mokuteki")



では今度は、検索でなく逐次実行について。
リストから条件にあったものだけを取り出し(抽出)です。
例えば僕は、matplotlibでプロットするときに、3列目が0未満だったら赤、0以上だったら青...
みたいな逐次処理での色分けをよくやります。
data2を3列のnumpy.arrayとし、3列目が0未満のものを抽出したいと思います。
これを高速にやるには以下2種があるようです。


3. filter
filter(lambda x: x < 0, data2[:,2])

lambda方式を使って非常に簡単にかけますね...

4. リスト内包表記
[x for x in data2[:,2] if x < 0]

forを使っているじゃないか!と思いきや普通のforの2倍速いそうです)

当たり前ですがfilterもリスト内包表記も「3列目」を見て、その行3列全てを取り出すのはできません。う〜ん...


追記
5. numpy.where
僕のやりたいことはnumpyでできそうです。
速度は...forよりは速いんだろうなあ...

data2[np.where(data2[:,2]<0),:]

何をやっているかというと、
data2[:,2]<0
ここで、3列目が0より小さい「行」がTrueで返されます
np.where(data2[:,2]<0),:
こうすると、3列目が0より小さい「行番号(0始まり)」が返されます。
data2[np.where(data2[:,2]<0),:]
これで、上記行番号の行を(",:"で他の列も全部を指定)抽出しています。


参照:
https://stackoverflow.com/questions/2701173/most-efficient-way-for-a-lookup-search-in-a-huge-list-python
https://stackoverflow.com/questions/3855537/fastest-way-to-sort-in-python
http://php6.jp/python/basics/%E3%83%AA%E3%82%B9%E3%83%88%E5%86%85%E5%8C%85%E8%A1%A8%E8%A8%98/

Comments

Popular posts from this blog

MacbookやiMacのSSD/HDDを完全消去する(High Sierra対応版)

conda clean --allはやってはいけない

Nintendo SwitchがあればChromecastはいらないぞ!