Форум сайта python.su
Всем доброго время суток!
Есть такая штука, которая построчно читает из файла выражение, возводит в 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
Отредактировано jigan-laym@mail.ru (Фев. 5, 2023 21:36:23)
Офлайн
jigan-laym@mail.ru#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 product(anew, repeat=4): temp_1=eval('*'.join(i)) XZ = XZ + integrate(temp_1, (t,0,1), (s, 0, pi))
jigan-laym@mail.ruА почему у тебя там N-1 везде в range(), а не N?
Полезные советы и замечания также приветствуются
>>> lst = ['a', 'b', 'c', 'd', 'e'] >>> >>> n = len(lst) >>> >>> for i in range(n - 1): ... i, lst[i] ... (0, 'a') (1, 'b') (2, 'c') (3, 'd') >>>
jigan-laym@mail.ruУскорь его без компиляции сначала. Компиляция в плане ускорения ничего не даст. Он медленный из-за работы со строками. Строки в питоне в несколько раз медленнее чисел. Поэтому и надо всё преобразовывать в числа первым делом, а с числами как со строками в питоне и не только в питоне работают только новички в программировании. Поэтому во всех вузах учат именно числа раскладывать на цифры (тоже числа) и работать с ними так, а не предлагают с ними работать как со строками, хотя это и выглядит удобнее. Строки в вузовских заданиях вообще запрещают использовать в численных задачах именно по этой причине.
А так медленно, но работает (вот на таком входном файле, где 5 слагаемых, время выполнения минут 20, а в реальной задаче нужно будет подавать файлы, с минимум 500 слагаемыми).
Основной вопрос: Как его скомпилировать в исполняемый файл?
Отредактировано py.user.next (Фев. 6, 2023 00:15:23)
Офлайн
py.user.next
На product ругается:
AttributeError: ‘list’ object has no attribute ‘free_symbols’ (и если я объявляю символьные переменные, и если не объявляю тоже).
По поводу N и N-1, виноват, обсчитался.
А от строк==символьные переменные я не избавлюсь.
Вот вы говорите строки медленные, а есть ли аналог C++-го класса vector (хотя он память выжирает в неограниченном количестве).
P.S. Друг мне на C++написал быстрое возведение в 4 степень (используя vector), но без интегрирования.
На выходе получается файл 4 Гб (это в самом простом самом маленьком случае).
Так вот Мапл его открывает сутки ровно то же самое, что если бы Мапл сам возводил в четвертую степень.
Офлайн
jigan-laym@mail.ruПолный код скинь.
На product ругается:
AttributeError: ‘list’ object has no attribute ‘free_symbols’
jigan-laym@mail.ruСтроки - это не символьные переменные. Строки - это когда вот ты файл прочитал, вот в итоге это строкой будет или списком строк. Или там заменяешь символ ^ на ** - эта замена в строках происходит. Вычисления в строках нельзя вести.
А от строк==символьные переменные я не избавлюсь.
>>> eval('1 + 2') 3 >>>
>>> 1 + 2 3 >>>
jigan-laym@mail.ruДа C++ - это лажа распиаренная. Там все конструкции просто дерьмо, что векторы эти, что списки. Там списки неполные, это же надо было додуматься. То есть ты делаешь связный список и потом тебе его ещё надо дописывать, чтобы он был полноценным связным списком. Наследование там недоделанное какое-то. Так что не стоит на него равняться. Да, на нём всё написано, но это, знаешь, только потому, что тогда ничего другого не было. Сейчас тоже только-только появились языки ему на замену. Ещё не перешли все на них, поэтому продолжают ещё писать на нём.
Вот вы говорите строки медленные, а есть ли аналог C++-го класса vector
jigan-laym@mail.ruНу, есть там алгоритмы быстрого возведения в степень. Но не факт, что они тебе нужны. Это просто тупо решение в лоб. Гораздо умнее будет что-то там сначала сделать, чтобы вот эта хрень, которая у тебя появилась, чтобы она вообще не появилась. Где-то там что-то там посчитать предварительно, чтобы никаких длинных выражений или кучи интегрирований не получалось и не требовалось в итоге.
Друг мне на C++написал быстрое возведение в 4 степень
jigan-laym@mail.ruОни все подчиняются алгоритмической временной сложности. Для этого не нужен квантовый компьютер, для этого нужно подумать, как это выражение упростить, чтобы оно не было таким огромным на этапе конечных вычислений.
Так вот Мапл его открывает сутки ровно то же самое
Отредактировано py.user.next (Фев. 6, 2023 23:52:38)
Офлайн
py.user.nextПолный код программки он вверху темы, только циклы заменил на твою подсказку.
Полный код скинь
#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 product(anew, repeat=4): temp_1=eval('*'.join(i)) XZ = XZ + integrate(temp_1, (t,0,1), (s, 0, pi)) #for i in range(N): # for j in range(N): # for k in range(N): # for n in range(N): # 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)
runfile('G:/докдисс/Программы Maple/Управление для Буссинеска/4degree/WithProduct.py', wdir='G:/докдисс/Программы Maple/Управление для Буссинеска/4degree') Traceback (most recent call last): File "G:\докдисс\Программы Maple\Управление для Буссинеска\4degree\WithProduct.py", line 45, in <module> for i in product(anew, repeat=4): File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\concrete\products.py", line 605, in product prod = Product(*args, **kwargs) File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\concrete\products.py", line 199, in __new__ obj = ExprWithIntLimits.__new__(cls, function, *symbols, **assumptions) File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\concrete\expr_with_limits.py", line 204, in __new__ pre = _common_new(cls, function, *symbols, File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\concrete\expr_with_limits.py", line 64, in _common_new free = function.free_symbols AttributeError: 'list' object has no attribute 'free_symbols'
Отредактировано jigan-laym@mail.ru (Фев. 7, 2023 00:53:07)
Офлайн
Вот этот участок кода
for i in product(anew, repeat=4): temp_1=eval('*'.join(i)) XZ = XZ + integrate(temp_1, (t,0,1), (s, 0, pi))
print(anew, type(anew[0])) for i in product(anew, repeat=4): print(i, type(i)) #temp_1=eval('*'.join(i)) #XZ = XZ + integrate(temp_1, (t,0,1), (s, 0, pi))
Офлайн
py.user.next
и вывод на экран скинь сюда
runfile('G:/докдисс/Программы Maple/Управление для Буссинеска/4degree/WithProduct.py', wdir='G:/докдисс/Программы Maple/Управление для Буссинеска/4degree') ['-4.1054687503*sin(s)', '+0.8437499978*sin(2.*s)', '-11.07064825*sin(2.*s)*bblb1rblb2rb*t**2', '-16.60597234*sin(2.*s)*bblb1rblb2rb*cos(1.154700539*t)', '+0.1994711401*sin(2.*s)*cclb2rblb2rb*t**2', '+1.196826839*sin(2.*s)*t**4*bblb1rblb2rb', '+8.571640841*sin(2.*s)*t**4*bblb2rblb2rb**3'] <class 'str'> Traceback (most recent call last): File "G:\докдисс\Программы Maple\Управление для Буссинеска\4degree\WithProduct.py", line 50, in <module> for i in product(anew, repeat=4): File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\concrete\products.py", line 605, in product prod = Product(*args, **kwargs) File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\concrete\products.py", line 199, in __new__ obj = ExprWithIntLimits.__new__(cls, function, *symbols, **assumptions) File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\concrete\expr_with_limits.py", line 204, in __new__ pre = _common_new(cls, function, *symbols, File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\concrete\expr_with_limits.py", line 64, in _common_new free = function.free_symbols AttributeError: 'list' object has no attribute 'free_symbols'
Офлайн
py.user.next
и вывод на экран скинь сюда
runfile('G:/докдисс/Программы Maple/Управление для Буссинеска/4degree/WithProduct.py', wdir='G:/докдисс/Программы Maple/Управление для Буссинеска/4degree') ['-4.1054687503*sin(s)', '+0.8437499978*sin(2.*s)', '-11.07064825*sin(2.*s)*bblb1rblb2rb*t**2', '-16.60597234*sin(2.*s)*bblb1rblb2rb*cos(1.154700539*t)', '+0.1994711401*sin(2.*s)*cclb2rblb2rb*t**2', '+1.196826839*sin(2.*s)*t**4*bblb1rblb2rb', '+8.571640841*sin(2.*s)*t**4*bblb2rblb2rb**3'] <class 'str'> Traceback (most recent call last): File "G:\докдисс\Программы Maple\Управление для Буссинеска\4degree\WithProduct.py", line 50, in <module> for i in product(anew, repeat=4): File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\concrete\products.py", line 605, in product prod = Product(*args, **kwargs) File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\concrete\products.py", line 199, in __new__ obj = ExprWithIntLimits.__new__(cls, function, *symbols, **assumptions) File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\concrete\expr_with_limits.py", line 204, in __new__ pre = _common_new(cls, function, *symbols, File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\concrete\expr_with_limits.py", line 64, in _common_new free = function.free_symbols AttributeError: 'list' object has no attribute 'free_symbols'
Офлайн
py.user.next
и вывод на экран скинь сюда
runfile('G:/докдисс/Программы Maple/Управление для Буссинеска/4degree/WithProduct.py', wdir='G:/докдисс/Программы Maple/Управление для Буссинеска/4degree') ['-4.1054687503*sin(s)', '+0.8437499978*sin(2.*s)', '-11.07064825*sin(2.*s)*bblb1rblb2rb*t**2', '-16.60597234*sin(2.*s)*bblb1rblb2rb*cos(1.154700539*t)', '+0.1994711401*sin(2.*s)*cclb2rblb2rb*t**2', '+1.196826839*sin(2.*s)*t**4*bblb1rblb2rb', '+8.571640841*sin(2.*s)*t**4*bblb2rblb2rb**3'] <class 'str'> Traceback (most recent call last): File "G:\докдисс\Программы Maple\Управление для Буссинеска\4degree\WithProduct.py", line 50, in <module> for i in product(anew, repeat=4): File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\concrete\products.py", line 605, in product prod = Product(*args, **kwargs) File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\concrete\products.py", line 199, in __new__ obj = ExprWithIntLimits.__new__(cls, function, *symbols, **assumptions) File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\concrete\expr_with_limits.py", line 204, in __new__ pre = _common_new(cls, function, *symbols, File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\concrete\expr_with_limits.py", line 64, in _common_new free = function.free_symbols AttributeError: 'list' object has no attribute 'free_symbols'
Офлайн
Вот перед этим участком кода
for i in product(anew, repeat=4): temp_1=eval('*'.join(i)) XZ = XZ + integrate(temp_1, (t,0,1), (s, 0, pi))
lst = ['-4.1054687503*sin(s)', '+0.8437499978*sin(2.*s)', '-11.07064825*sin(2.*s)*bblb1rblb2rb*t**2', '-16.60597234*sin(2.*s)*bblb1rblb2rb*cos(1.154700539*t)', '+0.1994711401*sin(2.*s)*cclb2rblb2rb*t**2', '+1.196826839*sin(2.*s)*t**4*bblb1rblb2rb', '+8.571640841*sin(2.*s)*t**4*bblb2rblb2rb**3'] out = list(product(lst, repeat=2)) print(out)
Отредактировано py.user.next (Фев. 7, 2023 09:44:08)
Офлайн