-
-
Notifications
You must be signed in to change notification settings - Fork 617
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
VSCode 用 debugpy 调试,加载 pinyin_dict
和 phrases_dict
这两个步骤时,速度严重下降
#319
Comments
换了种方式解决了,魔改了几行源代码。
import os
import pickle
def pickle_path(py__file__):
return py__file__[:-2] + "pkl"
def save_data_of(py__file__, data):
fp = pickle_path(py__file__)
with open(fp, "wb") as f:
pickle.dump(data, f)
def try_load_data_of(py__file__):
fp = pickle_path(py__file__)
if not os.path.isfile(fp):
return None
with open(fp, "rb") as f:
return pickle.load(f)
from pypinyin import dict_save_load
pinyin_dict = dict_save_load.try_load_data_of(__file__)
if not pinyin_dict:
from pypinyin.pinyin_dict_code import pinyin_dict
dict_save_load.save_data_of(__file__, pinyin_dict)
from pypinyin import dict_save_load
phrases_dict = dict_save_load.try_load_data_of(__file__)
if not phrases_dict:
from pypinyin.phrases_dict_code import phrases_dict
dict_save_load.save_data_of(__file__, phrases_dict)
from pypinyin import dict_save_load
phrases_dict = dict_save_load.try_load_data_of(__file__)
if not phrases_dict:
from pypinyin.phrases_dict_large_code import phrases_dict
dict_save_load.save_data_of(__file__, phrases_dict) 这个方案的缺点是,用户第一次必须以非 debug 模式运行一下代码,以确保在本地生成 pickle 二进制数据。如果第一次以 debug 模式运行的话,因为本地不存在 pickle 数据,所以必须从源代码初始化那几个硕大的 dict,这会导致第一次就以 debug 模式运行在初始化 dict 的时候会非常慢(我的机器上大概要等3~5分钟左右,R7-5800H 3.2GHz,DDR5-16G)。 更完善的思路是,让用户在安装 pypinyin 这个包的时候,就在本地生成 pickle 二进制数据,后面就可以直接加载 pickle 二进制,避免了第一次如果是 debug 模式会被 debugpy 拖慢的问题。本来想照这个思路做一个PR来提交,但是我不大清楚 py 包安装的脚本要怎么加这个过程所以没敢乱动安装脚本。 |
这个方法试过了但是貌似不管用,以 debugpy 启动调试后还是慢得不行,那两个 dict 实在太大了,除非环境变量开关能够免除这两个 dict 的初始化,不然就会被 debugpy 拖慢。 |
@qaqz111 感谢分享经验! |
python3.10没这问题,但3.12问题就出现了,我是改了个用法来规避这个问题: import subprocess _name = '测试' result = subprocess.run(command, stdout=subprocess.PIPE, text=True) _pinyin_list = result.stdout.strip().split() print(_pinyin_list) |
我在MacOS遇到同样问题 ,可能和python版本有关。步骤如下: 将最新版的 phrases_dict.py 文件复制到当前目录,然后分别用 python 3.12.4, python 3.11.7, python 3.9.7 执行 |
这两个库遇到有类似问题: |
@guyskk 感谢分享相关信息!如果时间允许的话,我争取这周末的时候参考大家提供的信息先发布一个优化这个问题的 beta 版本。 |
我在其他项目的 issue 里看到过一些相关信息,debugger 速度下降是因为对每一行代码插入了一些检查,以启用调试器的断点等功能,所以有一些库采用了另外一种迎合该机制的方法,将所有初始化代码写在一行之内,即不换行一次性写完,这样貌似也能避开被 debugger 拖慢速度的问题。 |
这里面可能有多个问题。我写了一个测试脚本,可以参考测试各种方案。
我在MacOS 命令行上运行,测试发现:
|
我的问题解决了,原因是我的命令行环境默认配置了 |
详见:#319 #322 * perf[code-loader]prevent py-code too large #322 * feat[generator]pinyin and phrases * feat[generator]one key initer * refine save dict into json and load from json on runtime * fix lint and test * try to fix "No module named distutils in Python 3.12" * try to fix "UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 118: character maps to <undefined>" * fix test on python2 --------- Co-authored-by: mozillazg <[email protected]>
我在维护
在更新至 |
@outloudvi 感谢反馈。我后面抽空发一下正式的 0.52.0 版本。 |
正式的优化该问题的 0.52.0 版本已发布。 |
运行环境
问题描述
在 VSCode 不做特别配置的情况下,调试(VSCode 应该是默认使用的 debugpy)引用了 pypinyin 的 python 代码,
在加载
pinyin_dict
和phrases_dict
这两个步骤时,速度严重下降到不可接受的地步。环境配置:win10 x64 企业版 22H2,VSCode 1.87.0,R7-5800H 3.20GHz,内存 16G,512G SSD。
同样是在 VSCode 中,以非调试模式运行相同的代码几乎感觉不到加载过程,
所以这并不是 pypinyin 代码的问题,应该是 debugpy 的调试机制严重拖慢了两个巨型 dict 的初始化过程。
在网络上搜了很久,发现没人提到过这个问题,请问这是个案吗?
应该如何在 VSCode 中调试引用了 pypinyin 的代码?
The text was updated successfully, but these errors were encountered: