web-dev-qa-db-ja.com

Pyinstallerで作成された.exeの高速化

プログラム(Python 3.6.1で記述、Python 3.5.3)を使用して変換)をPyinstallerを使用して.pyから.exeに変換しました。ただし、最適化した後でも、読み込みが非常に遅い(IDLEで実行する場合の<1秒と比較して約16秒かかります)== 問題だった(大量のモジュールをインポートするので、コードを必要なモジュールの部分のみをインポートする)に変更しました。IDLEで実行すると大幅に高速化されました。 、しかしそれから.exeを作成したときまったく同じでした(そして正しい.pyファイルを使用していることを確認しました)私はPyinstallerのようですシステムにインストールしたすべてのモジュールを、実際に使用されているモジュールの小さな部分だけでなく、.exeにパッケージ化するだけです(--onefileを使用する場合)。Pyinstallerがインストールするのはモジュールの必要な部分またはその他スピードアップ--onefileとpackagiを使用しながら単一の.exeに変換しますか?

完全なコード:

from os import path, remove
from time import sleep
from sys import exit
from getpass import getuser
from mmap import mmap, ACCESS_READ


my_file = "Text To Speech.mp3"
username = getuser()
no_choices = ["no", "nah", "nay", "course not", "don't", "dont", "not"]
yes_choices = ["yes", "yeah", "course", "ye", "yea", "yh", "do"]


def check_and_remove_file():

    active = mixer.get_init()
    if active != None:
        mixer.music.stop()
        mixer.quit()
        quit()
    if path.isfile(my_file):
        remove(my_file)


def get_pause_duration(audio_length, maximum_duration=15):

    default_pause, correction = divmod(audio_length, 12)
    return min(default_pause + bool(correction), maximum_duration)


def exiting():

    check_and_remove_file()
    print("\nGoodbye!")
    exit()


def input_for_tts(message):

    try:

        tts = gTTS(text = input(message))
        tts.save('Text To Speech.mp3')
        with open(my_file) as f:
            m = mmap(f.fileno(), 0, access=ACCESS_READ)
        audio = MP3(my_file)
        audio_length = audio.info.length
        try:
            mixer.init()
        except error:
            print("\nSorry, no audio device was detected. The code cannot complete.")
            m.close()
            exiting()   
        mixer.music.load(m)
        mixer.music.play()
        sleep(audio_length + get_pause_duration(audio_length))
        m.close()
        check_and_remove_file()

    except KeyboardInterrupt:

        exiting()


from pygame import mixer, quit, error
from gtts import gTTS
from mutagen.mp3 import MP3


check_and_remove_file()


input_for_tts("Hello there " + username + ". This program is\nused to output the user's input as speech.\nPlease input something for the program to say: ")


while True:

    try:

        answer = input("\nDo you want to repeat? ").strip().lower()
        if answer in ["n", no_choices] or any(x in answer for x in no_choices):
            exiting()
        Elif answer in ["y", yes_choices] or any(x in answer for x in yes_choices):
            input_for_tts("\nPlease input something for the program to say: ")
        else:
            print("\nSorry, I didn't understand that. Please try again with yes or no.")

    except KeyboardInterrupt:

        exiting()
7
Gameskiller01

ドキュメントを見てください、私はそれが遅い理由を説明していると思います: https://pyinstaller.readthedocs.io/en/stable/operating-mode.html#how-the-one-file-program -作品

簡単に言うと、プログラムの完全な環境を抽出して一時フォルダーに書き込む必要があります。

さらに、1ファイルオプションは予想とは対照的です: https://pyinstaller.readthedocs.io/en/stable/operating-mode.html#bundling-to-one-file

8
olisch

仮想環境を作成して、そこからプロジェクトを実行してみてください。次に、仮想環境内からpyinstallerを実行して、必要なものだけをパッケージ化します。これはあなたのために最も行います

次に、onedirオプションは、exeファイルから一時フォルダーにすべてのファイルを解凍する必要がないため、onefileよりも高速です。 Pyinstallerを使用すると、他のqnyインストーラーを使用して、プログラムファイルに移動したり、スタートなどでショートカットを作成したりすることが簡単にできます。

1
miThom