質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1020閲覧

numbaによる高速化について

wakaba08

総合スコア9

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/07/19 05:12

前提・実現したいこと

pythonでバイナリファイルを読み込む関数(bin_read)を高速化しようとしています.
環境はpython3.6

発生している問題・エラーメッセージ

numbaを導入して高速化を図ったのですが,jitありとjitなしで速度がほとんど変わりません.

該当のソースコード

python

1import numpy as np 2import struct 3import time 4from numba import jit 5 6def bin_read(fid,data_length,offset=0): 7 if offset!=0: fid.seek(offset*2,0) 8 data=np.zeros(data_length,dtype=None) 9 for i in range(data_length): 10 data[i]=struct.unpack('h',fid.read(2))[0] 11 return data 12 13@jit 14def bin_read_jit(fid,data_length,offset=0): 15 if offset!=0: fid.seek(offset*2,0) 16 data=np.zeros(data_length,dtype=None) 17 for i in range(data_length): 18 data[i]=struct.unpack('h',fid.read(2))[0] 19 return data 20 21if __name__ == '__main__': 22 fs=10*10**6 23 duration=0.5 24 fid = open('test.bin','rb') 25 t1 = time.time() 26 data=bin_read(fid,int(duration*fs*2)) 27 t2 = time.time() 28 print(type(data)) 29 elapsed_time = t2-t1 30 print("elapsed_time") 31 t1 = time.time() 32 data=bin_read_jit(fid,int(duration*fs*2)) 33 t2 = time.time() 34 elapsed_time = t2-t1 35 print("elapsed_time")

試したこと

↓このサイトに載っていたサンプルプログラムを試して実行速度が上がることは確認したので,numbaはしっかりインストールされていると思われます.
http://yutori-datascience.hatenablog.com/entry/2014/12/09/235628

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

原理的にI/Oバウンドになることと、主要な処理をそれなりに高速なライブラリ群にまかせているので、numbaを使った高速化はあまり期待できません。

先に丸ごとバイト列として読み込んでおくと、また違った結果になるかもしれません。

ところで、質問文のコードだと関数内でfidに対して副作用がある気がしますが、二回目のjit版の方の呼び出し時に問題が起きませんか?

投稿2018/07/19 05:24

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wakaba08

2018/07/19 05:33

ご回答ありがとうございました. fidについてのご指摘もありがとうございます. 確かにこの書き方は問題がありますね. 今回の場合はファイルの一部のみ読んでいるのでエラーが発生せず気づきませんでした.
wakaba08

2018/07/19 05:57

np.fromfile(fid,np.int16,1) とすることで同じ様に読み込みはできますが以前の方法と比較するとかなり遅いですね. またこれも高速化はされませんでした.
guest

0

pythonの実行速度をいくら早くしようと、ファイルのアクセスの速度は変わりません。

投稿2018/07/19 05:29

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問