Есть такая штука, которая построчно читает из файла выражение, возводит в 4 степень, почленно интегрирует и сохраняет в текстовый файл.
Худо бедно работает.
#pythran WithProduct(string) from itertools import product import math from sympy import * N: int i, j, k, n = 0, 0, 0, 0 with open("example.txt", "r") as f: a = [row.strip() for row in f] N = len(a) anew=[]; for i in range(0, N): anew.append(a[i].replace('[', 'lb').replace(']', 'rb').replace('^','**')) s, t = symbols('s t') bblb1rblb0rb, bblb1rblb1rb, bblb1rblb2rb = symbols('bblb1rblb0rb bblb1rblb1rb bblb1rblb2rb') bblb1rblb3rb, bblb1rblb4rb, bblb1rblb5rb = symbols('bblb1rblb3rb bblb1rblb4rb bblb1rblb5rb') bblb2rblb0rb, bblb2rblb1rb, bblb2rblb2rb = symbols('bblb2rblb0rb bblb2rblb1rb bblb2rblb2rb') bblb2rblb3rb, bblb2rblb4rb, bblb2rblb5rb = symbols('bblb2rblb3rb bblb2rblb4rb bblb2rblb5rb') bblb3rblb0rb, bblb3rblb1rb, bblb3rblb2rb = symbols('bblb3rblb0rb bblb3rblb1rb bblb3rblb2rb') bblb3rblb3rb, bblb3rblb4rb, bblb3rblb5rb = symbols('bblb3rblb3rb bblb3rblb4rb bblb3rblb5rb') bblb4rblb0rb, bblb4rblb1rb, bblb4rblb2rb = symbols('bblb4rblb0rb bblb4rblb1rb bblb4rblb2rb') bblb4rblb3rb, bblb4rblb4rb, bblb4rblb5rb = symbols('bblb4rblb3rb bblb4rblb4rb bblb4rblb5rb') bblb5rblb0rb, bblb5rblb1rb, bblb5rblb2rb = symbols('bblb5rblb0rb bblb5rblb1rb bblb5rblb2rb') bblb5rblb3rb, bblb5rblb4rb, bblb5rblb5rb = symbols('bblb5rblb3rb bblb5rblb4rb bblb5rblb5rb') cclb1rblb0rb, cclb1rblb1rb, cclb1rblb2rb = symbols('cclb1rblb0rb cclb1rblb1rb cclb1rblb2rb') cclb1rblb3rb, cclb1rblb4rb, cclb1rblb5rb = symbols('cclb1rblb3rb cclb1rblb4rb cclb1rblb5rb') cclb2rblb0rb, cclb2rblb1rb, cclb2rblb2rb = symbols('cclb2rblb0rb cclb2rblb1rb cclb2rblb2rb') cclb2rblb3rb, cclb2rblb4rb, cclb2rblb5rb = symbols('cclb2rblb3rb cclb2rblb4rb cclb2rblb5rb') cclb3rblb0rb, cclb3rblb1rb, cclb3rblb2rb = symbols('cclb3rblb0rb cclb3rblb1rb cclb3rblb2rb') cclb3rblb3rb, cclb3rblb4rb, cclb3rblb5rb = symbols('cclb3rblb3rb cclb3rblb4rb cclb3rblb5rb') cclb4rblb0rb, cclb4rblb1rb, cclb4rblb2rb = symbols('cclb4rblb0rb cclb4rblb1rb cclb4rblb2rb') cclb4rblb3rb, cclb4rblb4rb, cclb4rblb5rb = symbols('cclb4rblb3rb cclb4rblb4rb cclb4rblb5rb') cclb5rblb0rb, cclb5rblb1rb, cclb5rblb2rb = symbols('cclb5rblb0rb cclb5rblb1rb cclb5rblb2rb') cclb5rblb3rb, cclb5rblb4rb, cclb5rblb5rb = symbols('cclb5rblb3rb cclb5rblb4rb cclb5rblb5rb') XZ = 0 #temp_2 = product(anew, repeat=4) #for i in range(len(temp_2)): # temp_1=eval(product(anew, repeat=4)[i]) # XZ = XZ + integrate(temp_1, (t,0,1), (s, 0, pi)) for i in range(N-1): for j in range(N-1): for k in range(N-1): for n in range(N-1): temp_1=eval(anew[i]+'*'+anew[j]+'*'+anew[k]+'*'+anew[n]) XZ = XZ + integrate(temp_1, (t,0,1), (s, 0, pi)) XZ2 = str(XZ) XZ2.replace('lb','[').replace('rb',']').replace('**','^') with open("output2.txt", "w") as f_o: f_o.write(XZ2)
Пример входного файла
-4.1054687503*sin(s) +0.8437499978*sin(2.*s) -11.07064825*sin(2.*s)*bb[1][2]*t^2 -16.60597234*sin(2.*s)*bb[1][2]*cos(1.154700539*t) +0.1994711401*sin(2.*s)*cc[2][2]*t^2 +1.196826839*sin(2.*s)*t^4*bb[1][2] +8.571640841*sin(2.*s)*t^4*bb[2][2]^3
Вместо четырех вложенных циклов хотел использовать product, но вылетает ошибка “..free symbols..”.
А так медленно, но работает (вот на таком входном файле, где 5 слагаемых, время выполнения минут 20, а в реальной задаче нужно будет подавать файлы, с минимум 500 слагаемыми).
Основной вопрос: Как его скомпилировать в исполняемый файл?
Полезные советы и замечания также приветствуются
З.Ы. Дело происходит в spyder 3.9 (anaconda)