Мой сценарий с циклами for в списочном понимании медленнее, чем обычно для цикла - PullRequest
0 голосов
/ 24 июня 2019

Я просто хотел ускорить мой сценарий, который содержит много циклов, поэтому я попытался с использованием списков.Итак, мой первоначальный подход был:

 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, но опять-таки это было медленнее ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...