Python高速化! for文は遅いので、”これ”を使うと30倍早いですよ!【Google ColabのPython:コピペで動く!】

スポンサーリンク
Python

Pythonは遅いと言われることもありますが、ポイントを押さえた使い方をすると十分処理スピードを速い状態にできます。本記事ではfor文とそれ以外のコーディングでどのくらいスピードが違うかを示します。

また、本記事以外でも【コピペで動く!】Pythonで1.5GBのcsvファイル読み込み高速化:1分5秒⇒4秒程度 DASK , pickle (Pythonコードあり)にてPythonの高速化についてご紹介しています。

目標とすること

for文でできることを他のコマンドを使って高速に実行することを目指します。

使用するツール

使用するツールはGoogle Colaboratoryのpythonを使いますので、無料で、簡単に行うことができます。Google Colaboratoryについては以前書いた記事をご参照いただければと思います。

実際のコードとやっていること

実行するデータの作成する部分までをまずはコードでお示しします。

import pandas as pd
import numpy as np
import datetime

start_date = datetime.date(1990,1,1)
end=datetime.date.today()

date_df = pd.DataFrame(pd.date_range(start_date, end, freq='B').date, columns=['date'])

date_df["value"]=np.nan

display(date_df.head().append(date_df.tail(10)))

空のDataFrameを作成し、1990/01/01から今日(2022/05/13)までの毎営業日(月曜 – 金曜)で日付を入れていきます。今回の例では8400行の列が作成されています。2022/05/06が金曜日で、次の行が2022/05/09月曜日になっているのと見て取れると思います。

株価や他の指標的な物を想定して、ランダムに値を次の列に入れていきます。

import random
%%time
for i in range(len(date_df)):
  date_df.loc[i,"value"]=random.randint(0,len(date_df))

display(date_df.head().append(date_df.tail(10)))

Google Colaboratoryの %%time のコマンドを使うことでそのセルでの実行時間を確認できます。

今回の例では実行時間は1.74秒という事になります。

for文の場合

for文の場合の例を以下に示します。

%%time

date_df["FOR"]=np.nan
for i in range(len(date_df)):
  if date_df.loc[i,"value"] % 5 == 0:
    date_df.loc[i,"FOR"] = 5

display(date_df.head().append(date_df.tail(10)))

value列の値が5で割り切れる場合はFOR列に5という値を入力するコードになります。

実際の実行時間は569ミリ秒であることが分かります。

locを使う場合

locを使う場合の例を以下に示します。

%%time

date_df["loc"]=np.nan
date_df.loc[date_df["value"] %5 == 0,"loc"] = 5

display(date_df.head().append(date_df.tail(10)))

これもvalue列の値が5で割り切れる場合はFOR列に5という値を入力するコードになります。

実際の実行時間は18ミリ秒であることが分かります。

for文に比べて非常に早く、30倍相当早く実行されています。

ちなみにこのlocを使う分については以前の記事

【コピペで動く!】VIXと米国株指数の関係 コロナ前・コロナ後 Pythonコードあり【違いをみつけろ!】

「1月の相場が高ければ、その年の相場は高くなる」は本当か?Pythonで自分で調べてみよう!(Python コードあり)【コピペで動く!】Twitterで出てくる知見は本当か自分で調べてみよう。5

などでも扱っています。

lambdaを使う場合

lambdaを使う場合の例を以下に示します。

%%time

date_df["lambda"]=np.nan
date_df["lambda"]=date_df["value"].apply(lambda x: 5 if x %5 == 0 else np.nan)

display(date_df.head().append(date_df.tail(10)))

これもvalue列の値が5で割り切れる場合はFOR列に5という値を入力するコードになります。

実際の実行時間は17ミリ秒であることが分かります。

これもlocを使う場合と同様for文に比べて非常に早く、loc同様30倍程度早く実行されていることが分かると思います。

今回は8000行の日足での想定でしたが、分足や多数の列が存在する場合など、よりこの速度の改善が効いてくると思います。

結論

上記以外にもPythonのスピードアップを行う方法はあると思います。
ポイントを押さえた改善や施策で今回の例では約30倍高速に処理ができました。

特にPythonのfor文は速度の遅さが指摘されることが多いので、今回のような打開策は知識として知っておくと有用かなと思います。

この記事が皆さんのお役に立てば幸いです。

Pythonに関する記事をご紹介します。

Python高速化! for文は遅いので、”これ”を使うと30倍早いですよ!【Google ColabのPython:コピペで動く!】
【コピペで動く!】日本株、米国株で個別銘柄ベータ値(β値)を簡単に調べる方法 Python 米国株 Webサービス&コード 【Google Colabで違いをみつけろ!】
【コピペで動く!】Pythonで1.5GBのcsvファイル読み込み高速化:1分5秒⇒4秒程度 DASK , pickle (Pythonコードあり)
【コピペで動く!】Google ColabでPython を用いての 効率的フロンティア と ポートフォリオの最適化 Efficient Frontier & Portfolio Optimization with Python [Part 2/2]
【コピペで動く!】20行で資産運用モデル作成 Google ColabのPythonで 米国株の株価を取得し、グラフ・チャートを表示
【解決】Google ColabのPythonでエクセル(Excel)ファイルやCSVファイルに出力・入力する方法【コピペで動く!】
【解決】スクレイピングでHTTP Error 403: Forbiddenでアクセスできないときに試すべき方法【コピペで動く!】【Google Colab:Python:pd.read_html,selenium】
過去50年間のS&P500の季節性の値動きから負けにくいポジション構築はできるのか考える・大統領選挙のアノマリー対応!【コピペで動く!】Google ColabのPythonで自分で調べてみよう!
曜日による米国株指数(S&P500)のパフォーマンスに違いはあるのか?有利なポジション取りはできるのか?【Google ColabのPython:コピペで動く!】Twitterで出てくる知見は本当か自分で調べてみよう。
ボラティリティ クラスタリング(Volatility Clustering)について:Google ColabのPythonでの相場環境分析
【コピペで動く!】IB証券(インタラクティブ・ブローカーズ証券 )へのPythonでのAPI接続 ib_insync [自分が使っているPythonコード]
ConoHa WINGレンタルサーバーでPython! Webアプリcgiを動かす手順を紹介!3つの例あり【コピペで動く!】
株価時系列データを分析する上で正規化を行う事の重要性について紹介する【違いをみつけろ!】
対話型チャットAI「ChatGPT」が人気なので、アカウントの作成とか難しいことが分からない人向けにとりあえずBlogに埋め込んでみた!
TradingViewを使ってポートフォリオ運用(複数銘柄運用) 米国株 2019/10/01に10万ドル(約1000万円)投資していたらどうなった?TradingViewのミニチャートウィジェットで簡単確認!

コメント

  1. 匿名 より:

    for文が遅いというのもありますがデータフレームへのアクセス回数が違うのが本質的な違いで、むやみにループを回さす一気に処理することが効いていると思いますがあってますか?

    • tf より:

      匿名様 コメントいただきありがとうございます。
      私は特別ボトルネックになっている工程がどこにあるのか解析するのが専門ではないので、確定的なものを申し上げられるほどの知識を残念ながら持ち合わせておりませんが、for文でなくてもやりたいと思っていることができたり、実務家レベルでの目先の課題の解決方法という意味で、とらえてもらえればと思います。どうしてもPython自体が遅い、forがネックというような言われ方も多いので、その先入観をなくすことができればと思っています。

      直接的な回答にはなってないですが、ご理解いただけますと幸いです。TF

タイトルとURLをコピーしました