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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

6回答

4691閲覧

python コードを高速化したい

Tubasa1995

総合スコア83

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/02/05 07:13

編集2019/02/05 07:58

下記のコードを書いたのですが,
ちゃんと計算できるのですが,とてつもなく遅いです.
for文をつかっているからだと思いますが,
なにか良い手立てはないでしょうか.

ちなみに,よみこんでいるファイルは結合すると9000行1列になります.
それをappendしまくり,最後に9000*252行の一列のデータができるので
それをreshapeして9000行252列にしようとしました.

今30分ほど計算してますが
まだi=80程度です.

#!/usr/bin/env python2.7 # coding: utf-8 # test.py import pandas as pd import numpy as np import decimal as dec pressure_uniq = [] ###252点分のprobeファイルをそれぞれ結合する for i in range(252): print(i) pressure = [] pressure1 = pd.read_csv('pressure1/probedata_dome_prs_p'+str(i+1), delim_whitespace=True, comment='#',names=['A', 'B', 'C']) pressure2 = pd.read_csv('pressure2/probedata_dome_prs_p'+str(i+1), delim_whitespace=True, comment='#',names=['A', 'B', 'C']) pre1 = pressure1['C'] pre2 = pressure2['C'] pressure = pd.concat([pre1,pre2]) ###多少のかぶりがあるから,ユニークな値のみを抽出 for x in pressure: if x not in pressure_uniq: pressure_uniq.append(x) array_pressure_uniq = np.array(pressure_uniq) reshape_pressure_uniq = array_pressure_uniq.reshape(252,9000) np.savetxt('reshape_pressure.csv',reshape,delimiter=',')

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

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

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

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

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

guest

回答6

0

遅いのは実行時間というより、ファイルを500個以上読み込むから、じゃないでしょうか。
他の処理をさせずにファイル読み込みのみで実行時間を見てみれば。

投稿2019/02/05 07:28

y_waiwai

総合スコア87774

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

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

0

まずはProfileで実際に何が遅いのか見える化するのが鉄則ですよ。
https://docs.python.jp/3/library/profile.html?highlight=profile

投稿2019/02/05 09:49

t_obara

総合スコア5488

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

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

0

ダブりを消すのはnp.uniqueに任せた方がよいと思います。
また、あらかじめ読み込むデータ個数が分かっている場合は、その個数分の入れ物を用意しておいたほうが速くなります。
以下テストコードでは一瞬で処理できました。

Python

1import pandas as pd 2import numpy as np 3 4L,M = 4500,252 5a = np.empty((L*2*M)) # 空の入れ物を用意。9000*252 6 7for i in range(M): 8 print(i) 9 10 # ダミーデータ 11 df1 = pd.DataFrame({'C':np.random.rand(L)}) 12 df2 = pd.DataFrame({'C':np.random.rand(L)}) 13 14 # とにかく読み込む 15 a[i*L :(i+1)*L] = df1['C'].values 16 a[(i+1)*L:(i+2)*L] = df2['C'].values 17 18print(a.shape) # (2268000,) 19# 並びを維持したままダブりを消す 20# https://stackoverflow.com/questions/15637336/numpy-unique-with-order-preserved 21_, idx = np.unique(a, return_index=True) 22a = a[np.sort(idx)] 23print(a.shape) # (1138501,) 24# a = a.reshape(M,L*2) # ダブりを消すとこのカタチにならないのでは?

ちなみにですが、ダブりを消すとデータ個数が変わるのでreshape(252,9000)できないのでは?
それともダブり消したあとの個数が固定(252*9000)ということでしょうか?

投稿2019/02/05 08:41

編集2019/02/05 08:56
can110

総合スコア38266

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

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

hayataka2049

2019/02/05 08:44

np.uniqueはソート後の順序で結果を返すので(ソートしてgroupby的な実装)、コードの意味が変わります。
can110

2019/02/05 08:48

ご指摘ありがとうございます。 順序は維持しないといけないのか…
guest

0

python

1 2lst = [] 3for i in range(252): 4 print(i) 5 pressure1 = pd.read_csv('pressure1/probedata_dome_prs_p'+str(i+1), delim_whitespace=True, comment='#',names=['A', 'B', 'C']) 6 pressure2 = pd.read_csv('pressure2/probedata_dome_prs_p'+str(i+1), delim_whitespace=True, comment='#',names=['A', 'B', 'C']) 7 pre1 = pressure1['C'] 8 pre2 = pressure2['C'] 9 lst.append(pre1) 10 lst.append(pre2) 11 12s = set() 13for pre in lst: 14 for x in pre: 15 if x not in s: 16 s.add(x) 17 pressure_uniq.append(x) 18 19array_pressure_uniq = np.array(pressure_uniq) 20reshape_pressure_uniq = array_pressure_uniq.reshape(252,9000) 21np.savetxt('reshape_pressure.csv',reshape,delimiter=',')
解説

listのinは線形探索なので時間がかかります。setにして高速化を図ります。

コードを単純化するために重複除去はループ外に追い出しています。

投稿2019/02/05 08:38

編集2019/02/05 08:45
hayataka2049

総合スコア30933

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

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

0

どこの処理が遅いのか調べてみてください。処理によって最適化する方法が変わってきますので。

print も多いと負荷になるし。

y_waiwai さんと同じで、私もファイル読み込みかなぁ。それだけのデータをリレーショナル・データベースにいれるだけでも時間がかかりそう。

というか、「とてつもなく遅い」って、正確に何分でしょうか?

ひとによって時間の感覚は違います。これ、10分でおわるなら、そんなもんではないでしょうか?

投稿2019/02/05 07:55

Bindi

総合スコア129

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

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

Tubasa1995

2019/02/05 07:59

たぶん,終わるのに2時間程度かかるかとおもいます. 30分でi=80程度しかいってないです. どこに時間がかかるか調べてみます.
Tubasa1995

2019/02/05 08:10

そうやらユニークの部分でした. ファイルの読み込みは全て1秒以内でした. ユニークに時間がどんどん増えて行ってます. どんどんappendされているからだとは思いますが...
guest

0

pressureに含まれる値にかぶりが少ない(ほとんどがユニークな値)なのだとすると、以下の2重のforループの計算量のオーダーは、pressureに含まれる値の個数の二乗程度と考えられます。
どのぐらいの個数の値を処理しようとしているのか次第ですが、大きければ相当時間がかかると思われます。

for x in pressure: if x not in pressure_uniq: pressure_uniq.append(x)

早いソートアルゴリズムであるクイックソートの計算量のオーダーは N・Log(N)ですから、pressureをソートした後に、先頭から順に同じ値が並んでいる(重複した値)部分を取り除く(計算量のオーダーはN)ようにすると高速化できるかと思われます。

投稿2019/02/05 07:38

coco_bauer

総合スコア6915

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

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

Tubasa1995

2019/02/05 07:51

すいません,ほぼ初心者なので あまり理解ができないです... クイックソートというモヂュールがあるのですか?
coco_bauer

2019/02/05 08:18

9000*252行の一列のデータだと、データ数は230万(2.3M)ほど。二乗すると計算量は5.3兆(5.3T)。8コア、3GHzクロックのCPUで毎秒10億回(1G)の計算ができるなら、データの読み込みを除いて、5000秒(1時間半)ぐらいかなぁ。スワップが起きないように十分なメモリを積んでいるマシンなら。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問