Я просто хотел ускорить мой сценарий, который содержит много циклов, поэтому я попытался с использованием списков.Итак, мой первоначальный подход был:
gt_cat=open(gt)
next(gt_cat)
gf_cat=open(gf_celestial_out)
gt_reader=csv.reader(gt_cat)
gf_reader=csv.reader(gf_cat)
gf_coords_list=[]
for index_row, gf_line in enumerate(gf_reader):
gf_coords=SkyCoord(ra=[float(gf_line[0])]*u.degree,
dec=[float(gf_line[1])]*u.degree)
gf_coords_list.append(gf_coords)
gt_coords_list=[]
for index_column, gt_line in enumerate(gt_reader):
gt_coords=SkyCoord(ra=[float(gt_line[3])]*u.degree,
dec=[float(gt_line[4])]*u.degree)
gt_coords_list.append(gt_coords)
for row in range(dist_matrix.shape[0]):
for column in range(dist_matrix.shape[1]):
seperation=gf_coords_list[row].separation(gt_coords_list[column])
dist_matrix[row][column]=seperation.value
Этот стиль занял 95 секунд, чтобы закончить работу.Конечно, есть еще код, кроме этого, но это «большие» циклы.
После этого я использовал:
gf_ra, gf_dec = zip(*[(float(line[0]), float(line[1])) for _, line in enumerate(gf_reader)])
gt_ra, gt_dec=zip(*[(float(line[3]), float(line[4])) for _, line in enumerate(gt_reader)])
gf_coords_list = [SkyCoord(ra=gf_ra * u.degree, dec=gf_dec * u.degree) for gf_ra, gf_dec in
zip(gf_ra, gf_dec)]
gt_coords_list=[SkyCoord(ra=gt_ra * u.degree, dec=gt_dec * u.degree) for gt_ra, gt_dec in
zip(gt_ra, gt_dec)]
for row in range(dist_matrix.shape[0]):
for column in range(dist_matrix.shape[1]):
seperation=gf_coords_list[row].separation(gt_coords_list[column])
dist_matrix[row][column]=seperation.value
Этот код вместе с остальной частью сценария занимает103 сек.
Более того, я попытался
gf_coords_list=[SkyCoord(ra=[float(gf_line[0])]*u.degree, dec=[float(gf_line[1])]*u.degree) for
index_row, gf_line in enumerate(gt_reader)]
и
gt_coords_list=[SkyCoord(ra=[float(gt_line[0])]*u.degree, dec=[float(gt_line[1])]*u.degree) for
index_row, gt_line in enumerate(gt_reader)]
вместо циклов for, но опять-таки это было медленнее ..