pythonで配列追加の処理速度の違い
pythonで配列追加の処理速度を比べてみました。
"append"を使う方法
import time def process(): result = [] start_time = time.time() for _ in range(10000000): result.append("test") processing_time = time.time() - start_time return processing_time In [5]: process() Out[5]: 0.8140008449554443
"+="を使う方法
import time def process(): result = [] start_time = time.time() for _ in range(10000000): result += "test" processing_time = time.time() - start_time return processing_time In [8]: process() Out[8]: 1.365239143371582
rubyとか普段使っていたら記号とか使いがちですが、 ここはスタンダードにappendを使うほうが倍ぐらい早い感じでした。
pythonのリスト内包表記と普通のfor文どちらが早いか
リスト内包表記と普通のfor文どちらが早いかを確かめてみました。
普通のfor文
import time def process(): start_time = time.time() result = [] for i in range(30000000): result += [i] processing_time = time.time() - start_time return processing_time In [97]: process() Out[97]: 4.502268075942993
リスト内包表記
import time def process(): start_time = time.time() result = [i for i in range(3000000)] processing_time = time.time() - start_time return processing_time In [91]: process() Out[91]: 1.3883929252624512
結果的にリスト内包表記のほうが3倍早かったです。
djangoでjupyter notebookを使う方法
djangoでjupyter notebookを使おう
pythonicでデータ分析をする方ならjupyetrを使う方は多いのではないでしょうか?
ただ、web開発で何かしらのフレームワーク使っていたらjupyter使うって感じにならないですよね。。。 (自分だけかもしれないですが)
しかし、web開発でデータ分析している所があったら、そこはDB通してjupyterでやったほうが楽な気がします。
なので、今回はdjangoでjupyterを使う方法書いていきます。
まずは djangoのextensionをインストールしましょう!
pip install django-extensions
次にsetting.pyに以下のように追加しましょう
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app', 'django_extensions', # この行を追加 )
jupyter起動
そしてあとはshell_plusに以下のようにoptionを追加しましょう。
python manage.py shell_plus --notebook
これでjupyter使えちゃいます! 便利!!
rubyで引数の初期値がある時の順番の個人的に良い方法
引数の初期値がある時の順番で困る時ってありますよね 例えば、第二引数の初期値を設定する時
def file(name="foo.jpg", mode="rb") File.open(name, mode) end
こういう時、第一引数を変えずに、第二引数だけ変えて 呼び出すときは以下のようにしないといけません。
file("foo.jpg", "r")
ただ、これって無駄な感じがします。 なので、以下のように順番を入れ替えたり。。。
def file(mode="rb", name="foo.jpg") File.open(name, mode) end
となる人おもいるかと思いますが、ぶっちゃけ順番に意味があったり、引数増えたりすると、どんどんわかりにくくなります。
なので、個人的にはキーワード引数にするのがいい気がします。
def file(name: "foo.jpg", mode: "rb") File.open(name, mode) end
すると以下のように呼び出せるので。
file(mode: "rb")
まぁ、引数をどうするかは時と場合の設計によるので常々ベストプラクティス考えながら実装できれば良いと思います。
rubyの引数を初期値で配列にするってどうなの?
rubyって色々便利なものがあるんですよね、そこで引数について考察です。 例えば、引数を配列にするとか。
①と②の例は同じことをしていますが①はスッキリしていますが、②は冗長的です。 おそらくruby的に美しいのは①なのでしょう。
①引数を配列にする
argu = "test" def func1(*argu_list) p argu_list end func1(argu)
②引数を配列にしない
argu = "test" def func2(argu) argu_list = [] argu_list << argu p argu_list end func2(argu)
ただ、個人的にはこれってrubyに慣れ親しんでないとわからない気がします。 いわゆる、はじめからリストを引数に渡せば良いような気もします。
*argu_list使うメリットとしてはインターフェースとして良い場合があるのでメリットも大きいのですが、個人的にはどちらでも良いかなという印象です。