我试图找到一种有效的方法来将包含整数点的数据行配对在一起,并将它们存储为 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
效率低下的另一部分似乎是all_point_sets
. 取出all_point_sets.append(...)
线似乎使代码从〜7秒变为2秒!
如何加快速度?谢谢。
跟进感谢大家的好建议-他们都很有帮助。但即使进行了所有改进,处理 100,000 个条目仍然需要大约 3 秒。我不确定为什么在这种情况下它不仅仅是即时的,以及是否有另一种表示可以使它即时。在 Cython 中编码会改变事情吗?有人可以举个例子吗?再次感谢。