J'essaie de trouver un moyen efficace pour lier ensemble les lignes de données contenant les entiers de points, et de les stocker comme des objets Python. Les données se compose d' X
et Y
des points de coordonnées, représenté sous forme de chaînes séparées par des virgules. Les points doivent être appariés, comme en (x_1, y_1), (x_2, y_2), ...
etc. et ensuite stockée sous la forme d'une liste d'objets, où chaque point est un objet. La fonction ci-dessous get_data
génère cet exemple de données:
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
Le code d'analyse que j'ai maintenant est:
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)
Actuellement, il faut compter près de 7 secondes pour 100 000 points, ce qui semble très inefficace. Une partie de l'inefficacité semble provenir de la base de calcul de first_points
, second_points
et paired_points
- et la transformation de ces objets.
Une autre partie de l'inefficacité semble être la construction d' all_point_sets
. En prenant de l' all_point_sets.append(...)
ligne semble faire le code à partir de ~7 secondes à 2 secondes!
Comment cela peut-il être accéléré? merci.
SUIVI Merci pour tous les grands suggestions - ils sont tous utiles. mais même avec toutes les améliorations, c'est encore d'environ 3 secondes à 100 000 entrées. Je ne suis pas sûr pourquoi, dans ce cas, il n'est pas juste à l'instant, et si il existe une autre représentation qui en ferait l'instant. Serait-ce codage en Cython changer les choses? Quelqu'un pourrait-il offrir un exemple de cela? merci encore.