Найти - Пользователи
Полная версия: Как скомпилировать в исполняемый файл
Начало » Python для новичков » Как скомпилировать в исполняемый файл
1 2
jigan-laym@mail.ru
Всем доброго время суток!
Есть такая штука, которая построчно читает из файла выражение, возводит в 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)
py.user.next
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 слагаемыми).
Основной вопрос: Как его скомпилировать в исполняемый файл?
Ускорь его без компиляции сначала. Компиляция в плане ускорения ничего не даст. Он медленный из-за работы со строками. Строки в питоне в несколько раз медленнее чисел. Поэтому и надо всё преобразовывать в числа первым делом, а с числами как со строками в питоне и не только в питоне работают только новички в программировании. Поэтому во всех вузах учат именно числа раскладывать на цифры (тоже числа) и работать с ними так, а не предлагают с ними работать как со строками, хотя это и выглядит удобнее. Строки в вузовских заданиях вообще запрещают использовать в численных задачах именно по этой причине.
jigan-laym@mail.ru
py.user.next
На product ругается:
AttributeError: ‘list’ object has no attribute ‘free_symbols’ (и если я объявляю символьные переменные, и если не объявляю тоже).

По поводу N и N-1, виноват, обсчитался.

А от строк==символьные переменные я не избавлюсь.
Вот вы говорите строки медленные, а есть ли аналог C++-го класса vector (хотя он память выжирает в неограниченном количестве).

P.S. Друг мне на C++написал быстрое возведение в 4 степень (используя vector), но без интегрирования.
На выходе получается файл 4 Гб (это в самом простом самом маленьком случае).
Так вот Мапл его открывает сутки ровно то же самое, что если бы Мапл сам возводил в четвертую степень.
py.user.next
jigan-laym@mail.ru
На product ругается:
AttributeError: ‘list’ object has no attribute ‘free_symbols’
Полный код скинь.

jigan-laym@mail.ru
А от строк==символьные переменные я не избавлюсь.
Строки - это не символьные переменные. Строки - это когда вот ты файл прочитал, вот в итоге это строкой будет или списком строк. Или там заменяешь символ ^ на ** - эта замена в строках происходит. Вычисления в строках нельзя вести.

Вот это неправильно
  
>>> eval('1 + 2')
3
>>>
Потому что сначала создаётся строка ‘1 + 2’.

А вот это правильно
  
>>> 1 + 2
3
>>>
Потому что тут нет строк.

Результат один и тот же, только в первом случае через строку сделано, а во втором случае только через числа. Второй код быстрее работает.

jigan-laym@mail.ru
Вот вы говорите строки медленные, а есть ли аналог C++-го класса vector
Да C++ - это лажа распиаренная. Там все конструкции просто дерьмо, что векторы эти, что списки. Там списки неполные, это же надо было додуматься. То есть ты делаешь связный список и потом тебе его ещё надо дописывать, чтобы он был полноценным связным списком. Наследование там недоделанное какое-то. Так что не стоит на него равняться. Да, на нём всё написано, но это, знаешь, только потому, что тогда ничего другого не было. Сейчас тоже только-только появились языки ему на замену. Ещё не перешли все на них, поэтому продолжают ещё писать на нём.

В питоне аналог vector из C++ - это обычный список list.

У тебя оно долго происходит всё не потому, что у тебя там язык интерпретируемый, а не компилируемый и так далее, а потому, что у тебя временная сложность алгоритма O(n^4). То есть для десяти коэффициентов у тебя будет десять тысяч перемножений, а для ста коэффициентов у тебя будет сто миллионов перемножений. Оттуда эти часы, дни, недели и появляются. Плюс ещё к этому добавь строки в питоне, которые в десять раз медленнее чисел в питоне, можешь ещё на десять умножать это всё.

jigan-laym@mail.ru
Друг мне на C++написал быстрое возведение в 4 степень
Ну, есть там алгоритмы быстрого возведения в степень. Но не факт, что они тебе нужны. Это просто тупо решение в лоб. Гораздо умнее будет что-то там сначала сделать, чтобы вот эта хрень, которая у тебя появилась, чтобы она вообще не появилась. Где-то там что-то там посчитать предварительно, чтобы никаких длинных выражений или кучи интегрирований не получалось и не требовалось в итоге.

jigan-laym@mail.ru
Так вот Мапл его открывает сутки ровно то же самое
Они все подчиняются алгоритмической временной сложности. Для этого не нужен квантовый компьютер, для этого нужно подумать, как это выражение упростить, чтобы оно не было таким огромным на этапе конечных вычислений.
jigan-laym@mail.ru
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'

А если я evalом вначале по списку пробегусь и как бы перейду к символьным переменным, то ничего не изменит жеж с точки зрения скорости ?

В ответе мне нужен полином от bblb1rblb0rb, bblb1rblb1rb, … который будет минимизироваться (но это потом).

“Гораздо умнее будет что-то там сначала сделать, чтобы вот эта хрень, которая у тебя появилась, чтобы она вообще не появилась. Где-то там что-то там посчитать предварительно, чтобы никаких длинных выражений или кучи интегрирований не получалось и не требовалось в итоге.” Но, к сожалению, такова жизнь) такова математическая задача)
py.user.next
Вот этот участок кода
  
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))
и вывод на экран скинь сюда.
jigan-laym@mail.ru
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'
jigan-laym@mail.ru
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'
jigan-laym@mail.ru
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
Вот перед этим участком кода
  
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)
и вывод на экран скинь сюда.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB