整数点を含むデータの行をペアにして、Pythonオブジェクトとして保存する効率的な方法を見つけようとしています。データは、コンマ区切りの文字列として表される座標点で構成さX
れます。Y
ポイントは、などのようにペアにしてから(x_1, y_1), (x_2, y_2), ...
、オブジェクトのリストとして保存する必要があります。各ポイントはオブジェクトです。以下の関数get_data
は、このサンプルデータを生成します。
def get_data(N=100000, M=10):
import random
data = []
for n in range(N):
pair = [[str(random.randint(1, 10)) for x in range(M)],
[str(random.randint(1, 10)) for x in range(M)]]
row = [",".join(pair[0]),
",".join(pair[1])]
data.append(row)
return data
私が今持っている解析コードは次のとおりです。
class Point:
def __init__(self, a, b):
self.a = a
self.b = b
def test():
import time
data = get_data()
all_point_sets = []
time_start = time.time()
for row in data:
point_set = []
first_points, second_points = row
# Convert points from strings to integers
first_points = map(int, first_points.split(","))
second_points = map(int, second_points.split(","))
paired_points = zip(first_points, second_points)
curr_points = [Point(p[0], p[1]) \
for p in paired_points]
all_point_sets.append(curr_points)
time_end = time.time()
print "total time: ", (time_end - time_start)
現在、これは100,000ポイントで7秒近くかかりますが、これは非常に非効率的です。first_points
非効率性の一部は、、、second_points
およびpaired_points
-の計算とこれらのオブジェクトへの変換に起因するようです。
非効率性のもう1つの部分は、の蓄積であるようですall_point_sets
。行を削除するall_point_sets.append(...)
と、コードが約7秒から2秒になるようです。
これをどのようにスピードアップできますか?ありがとう。
フォローアップみんなの素晴らしい提案に感謝します-それらはすべて役に立ちました。ただし、すべての改善を行っても、100,000エントリを処理するのに約3秒かかります。この場合、それが単なる瞬間ではない理由と、それを瞬間的にする代替表現があるかどうかはわかりません。これをCythonでコーディングすると、状況が変わりますか?誰かがその例を提供できますか?再度、感謝します。