旅好きエンジニアのメモ

旅のこと映画、統計、会計、プログラミングなど、気の向くままに語ります

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倍早かったです。

pythonの標準入力で気をつける

pythonの標準入力

なんか色んな記事を見ていると、

import sys
sys.stdin.read()
sys.stdin.readline()
sys.stdin.readlines()

rau_input()

などがありますが rau_input()はpython2なので

python3は下記を使いましょう。

input()

それにしてもpythonの記事を書くときはバージョンの明記は必要な気がします。 (まぁ、自分も全部できていないですが。。。)

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使えちゃいます! 便利!!

25日の移動平均線をpythonで求める方法

亀のような遅さでトレードの自動売買システムを作成しています。。。 djangoで作ろうとしているので完成が見えない。。。(フロントなくそうかな。。。bottleにしようか。。。)

今回は25日の移動平均線を求めてみました。

はい、下のコードで終わりです!!(pandasすごく便利です)

import pandas as pd
moving_average_list = pd.rolling_mean(daily_bars, 25, 1)

まぁ、実際はここから色々な指標を作成していますがここでは書かないです(笑)

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使うメリットとしてはインターフェースとして良い場合があるのでメリットも大きいのですが、個人的にはどちらでも良いかなという印象です。

ruby有識者が多いプロジェクトなら *argu_list使って、そうでもないなら使わなくても良いかなと思います。