Ускорение Python через Cython
Пытаюсь ускорить код на Python. Переписал код для Cython, но улучшений в производительности не вижу(вызывается метод change_structure извне, т.е. при импортировании этого кода и вызова в другом файле). Я правильно понимаю, что ускорить можно только стандартные операции (+,-,/ и тд) и при определенных типах переменных, а также не все библиотеки Python? Подскажите, как переработать код. Я также смотрел html файл, где подсвечиваются места взаимодействия С с Python: везде где используется библиотека cpymad, например. Получается основная проблема в ней: т.к. она уже написана на С, выйгрыша в скорости не будет? Код выглядит так:
%%cython
import numpy as np
cimport numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
from cpython cimport array
from cpymad.madx import Madx
cdef class Structure():
cdef public str structure
cdef public list structure_in_lines
cdef public str bad_structure
cdef public list bad_structure_in_lines
cdef public int BPMs_number
def __init__(self, str structure_file="", str bad_structure_file=""):
"""
Initialize class Structure.
:param str structure_file: file name with structure
:param str bad_structure_file: file name with bad structure
"""
self.structure = structure_file
self.structure_in_lines = open(self.structure).readlines()
self.bad_structure = bad_structure_file
self.bad_structure_in_lines = open(self.bad_structure).readlines()
self.BPMs_number = 54
cpdef object change_structure(self, str structure, list elements_to_vary, int parameter_number, float variation_step,
np.ndarray[double,ndim=1] accumulative_param_additive):
"""
Change parameters of elements in the structure.
:param str structure: file name with structure
:param list elementss_to_vary: list of parameters
:param int parameter_number: number of varying parameter
:param float variation_step: step to vary elements parameters
:param float accumulative_param_additive: to accumulate parameters changes after iterations
:return: float twiss_table of structure properties
"""
cdef int number_of_elements = len(parameters_to_vary)
cdef np.ndarray[double,ndim=1] variations_list = np.zeros(number_of_elements)
variations_list[parameter_number] = variation_step
cdef np.ndarray[double,ndim=1] accumulative_param_additive_ = accumulative_param_additive + variations_list
cdef object madx
madx = Madx(stdout=False)
madx.option(echo=False, warn=False, info=False, twiss_print=False)
madx.call(file=structure)
madx.input('beam,particle=electron,energy=1.8;')
cdef int i
cdef float k1
for i in range(number_of_elements):
if elements_to_vary[i][2] == 'quadrupole':
k1 = float(elements_to_vary[i][8]) + accumulative_param_additive_[i]
madx.command.quadrupole.clone(elements_to_vary[i][0], L=float(elements_to_vary[i][5]), k1=k1)
madx.input('use,sequence=RING;')
madx.input('select,flag=twiss,class=monitor;')
madx.twiss(sequence='RING', centre=True, table='twiss', file="log_file.txt")
madx.input('readtable,file="log_file.txt",table=twiss_in_BPMs;')
cdef object twiss_table
twiss_table = madx.table.twiss_in_BPMs.x, madx.table.twiss_in_BPMs.y
madx.quit()
return twiss_table