Я пытаюсь найти эффективный способ объединить строки данных, содержащих целые точки, и сохранить их как объекты 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)
В настоящее время это занимает почти 7 секунд для 100 000 пунктов, что кажется очень неэффективным. Часть неэффективности, по-видимому, связана с вычислением first_points
, second_points
и paired_points
- и преобразованием их в объекты.
Другая часть неэффективности - это создание all_point_sets
. Вывод строки all_point_sets.append(...)
, по-видимому, приводит к переходу кода от ~ 7 секунд до 2 секунд!
Как это может ускориться? спасибо.
FOLLOWUP Спасибо за отличные предложения - все они были полезны. но даже со всеми улучшениями, он все еще около 3 секунд для обработки 100 000 записей. Я не уверен, почему в этом случае это не сразу, и есть ли альтернативное представление, которое сделает его мгновенным. Будет ли кодирование этого в Китоне меняться? Может ли кто-нибудь предложить пример? Еще раз спасибо.