Pythonの処理を高速化する方法 / NumPy, Numba, Cython

PythonはC, C++などのコンパイル型の言語に比べるとループの処理が遅いと言われています。

Rust とは? 特徴や将来性

【環境構築】Rust M1 Mac

金融アルゴリズムの実装にはループが必須であり、ループ処理の遅いPythonは金融アルゴリズムには向かないという考えもあります。

本日はPythonを高速処理するために知識をmemoしていきます。

NumPyを使う方法

まずは高速化前のPythonのループ例。

import random
# Sの変数を初期化
# 乱数値をSに追加
# 平均値を返す
def average_py(n):
    s = 0
    for i in range(n):
        s += random.random()
    return s / n  
# ループの反復回数
n = 10000000  
# この処理の実行時間
%time average_py(n)  
# 実行を繰り返し信頼できる推定値を出す
%timeit average_py(n)
# 825 ms ± 244 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)と返ってくる(筆者の環境下での数値)
# 関数の代わりにリスト内包表記を使う
%time sum([random.random() for _ in range(n)]) / n  

高速化

import numpy as np
def average_np(n):
    s = np.random.random(n)
    return s.mean()  
%time average_np(n)
%timeit average_np(n)
# 50.3 ms ± 16.7 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)と返ってくる(筆者の環境下での数値)
s = np.random.random(n)
s.nbytes  
かなりメモリが喰われるのがデメリットですが、高速化に成功しています。

Numbaを使う方法

NumbaはPythonを動的コンパイルするためのパッケージです。

import numba
# ここでNumbaの関数を作成
average_nb = numba.jit(average_py)  
%time average_nb(n)  
%time average_nb(n)  
# 二回目の実行から速くなります
# 劇的に速くなっているのが伺えます
%timeit average_nb(n)  

Cythonを使う方法

CythonはPythonコードを静的コンパイルするパッケージです。

%load_ext Cython
# Cythonでrandomをインポート
# i, s それぞれに静的型を追加
%%cython -a
import random
def average_cy1(int n):
    cdef int i
    cdef float s = 0
    for i in range(n):
        s += random.random()
    return s / n
%time average_cy1(n)
%timeit average_cy1(n)
%%cython
from libc.stdlib cimport rand
cdef extern from 'limits.h':
    int INT_MAX
cdef int i
cdef float rn
for i in range(5):
    rn = rand() / INT_MAX
    print(rn)
%%cython -a
from libc.stdlib cimport rand
cdef extern from 'limits.h':
    int INT_MAX
def average_cy2(int n):
    cdef int i
    cdef float s = 0
    for i in range(n):
        s += rand() / INT_MAX
    return s / n
%time average_cy2(n)
%timeit average_cy2(n)
Cython = Python + C から呼ばれています。

Kotaro
Kotaro
服部 洸太郎
音大を卒業後ピアニストとして活動。
自身のピアノトリオで活動後北欧スウェーデンにてシンガーアーティストLindha Kallerdahlと声帯とピアノによる即興哲学を研究。
その後ドイツへ渡りケルンにてAchim Tangと共に作品制作。
帰国後、金田式電流伝送DC録音の名手:五島昭彦氏のスタジオ「タイムマシンレコード」にアシスタントとして弟子入りし、録音エンジニアとしての活動開始。
独立後、音楽レーベル「芸術工房Pinocoa(現在はKotaro Studioに統合)」を立ち上げ、タンゴやクラシックなどのアコースティック音楽作品を多数プロデュース。
その後、秋山庄太郎氏後継の写真スタジオ「村上アーカイブス」でサウンドデザイナー兼音響担当として映像制作チームに参加。
村上宏治氏の元で本格的に写真、映像技術を学ぶ。
祖父母の在宅介護をきっかけにプログラムの世界に興味を持ち、介護で使えるプログラムをM5Stackを使って自作。
株式会社 ジオセンスの代表取締役社長:小林一英氏よりプログラムを学ぶ。
現在はKotaro Studioにてアルゼンチンタンゴをはじめとした民族音楽に関する文化の研究、ピアノ音響、さらに432hz周波数を使った癒しのサウンドを研究中。
スタジオでは「誰かのためにただここに在る」をコンセプトに、誰がいつ訪れても安心感が得られる場所、サイトを模索中。