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

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

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

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

Q&A

解決済

3回答

3733閲覧

Pythonの辞書で大規模データを扱うと遅くなってしまう

ytkt

総合スコア12

Python

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

0グッド

2クリップ

投稿2018/10/27 10:12

Pythonで大規模のテキストデータを扱おうとしたのですが、量が増えるにつれ、かなり遅くなってしまうのですが解決方法などありますでしょうか?
具体的には以下のように単語をキーにした辞書で、その情報をリストで追加する形を取っています。
プログラムの途中までで出力したところ、辞書のサイズは120000ほど、一度の参照と追加に20msほどかかってしまっています。容量が少なければ0.005msくらいなのでかなり遅くなっていることが分かります。

環境はメモリ16GのCPUがi7で、pythonのバージョンは3.6です。
メモリの使用量は監視していましたが、ベンチマークを測った時では半分も使用していませんでした。

d[word] = d.get(word, []) + [info]

よろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

リストの生成に時間がかかっているのかもしれません。

リストどうしを+すると新しいリストがメモリに作成されるので効率が悪いです。
.appendでin-placeに要素を追加するほうがいいと思います。

python

1d.setdefault(word, []).append(info)

投稿2018/10/27 11:03

karamarimo

総合スコア2551

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

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

ytkt

2018/10/27 12:37

その通りだったみたいです。ご指摘いただいたように修正してみたら倍以上早くなりました。 ありがとうございます。
guest

0

「そんなに遅くないだろう」と思って測ってみたらやっぱり遅くなかったです。

python

1from collections import deque 2from os import urandom 3from time import perf_counter 4 5from pygal import Line 6 7 8laps = deque() 9d = {} 10for word in range(120000): 11 lap = perf_counter() 12 d[word] = d.get(word, []) + [urandom(10)] 13 laps.appendleft(perf_counter() - lap) 14Line()(*laps).render_in_browser()

laps.html

辞書とは関係のない別の要因で遅くなっているんじゃないでしょうか?

測定PC情報

C:\Users\sakurai\Desktop>wmic path Win32_Processor get name Name Intel(R) Core(TM) i7-7600U CPU @ 2.80GHz

投稿2018/10/27 12:23

編集2018/10/27 12:30
YouheiSakurai

総合スコア6142

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

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

ytkt

2018/10/27 12:38

辞書というよりもlistの連結に時間がかかっていたみたいです。 検証までしていただきありがとうございます。
YouheiSakurai

2018/10/27 12:40

いえいえ、pygalの練習にグラフを書いてみたかっただけです。解決されたようで良かったです。
guest

0

DB の利用を検討してみてはいかがでしょう。
状況によってはインメモリデータベースという選択肢もありえるかもしれません。

投稿2018/10/27 10:47

katoy

総合スコア22324

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

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

ytkt

2018/10/27 12:36

sqliteのインメモリで行ってみましたが、結構時間かかってしまってます。 Redisなども検討しましたが、標準もしくはライブラリでなんとかしたかったので、今後検証してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問