我正在尝试使用hotshot优化一些代码,我希望它很好,因为它是高性能的分析器和所有.但由于某种原因,我得到了非常不准确的结果.在我最近的分析运行中,hotshot报告了我称之为7.946秒的顶级函数的累积时间.但是,如果没有计时,我可以告诉它需要更长的时间.使用time.time()自己定时运行时间给我一个42.465秒的运行时间.我猜这是因为hotshot不计算系统IO时间或其他什么,我的程序是批量处理大量的二进制文件?
但是,使用更多time.time()块我将大部分额外时间使用(hotshot未注意到)缩小到不执行任何IO的较低级别处理功能.hotshot报告该功能的总时间和累计时间分别为4.414和6.185秒.但是,再次使用time.time()语句我发现它的累积时间超过30秒.在一个相对简单的代码块中花费的累积时间是7.32秒,比在整个函数中花费的热点更长.该块看起来像这样:
format = element[1]
if isinstance(format, tuple):
format, operator, operand = format
else:
operator, operand = (None, None)
Run Code Online (Sandbox Code Playgroud)
而已.这个区块运行了900多万次,所以也许我不应该感到惊讶的是花了这么多时间.但显然没有IO在这里完成.为什么热点如此低估了这个功能(以及整个程序)的时间?
在你问之前,不,我没有使用多线程或类似的东西.
我试图通过在 numpy 中进行解析/数据积累来加速我去年编写的二进制文件解析器。numpy 能够定义自定义数据结构并将数据从二进制文件中提取到它们中,这看起来像我需要的,除了这些文件中的某些字段是“非标准”长度(例如 6 字节)的无符号整数。由于我使用的是 Python 2.7,因此我制作了自己的 int.from_bytes 模拟版本来处理这些字段,但是如果有任何方法可以在 numpy 中将这些字段本地读取为整数,那显然会更快且更可取。
一年前我已经问过这个问题.我的应用程序使用Python的多处理模块,从命令行运行时工作正常,但是当我使用Pyinstaller将其打包为可执行文件时,多个进程会生成为原始的新实例,而不是运行它们应该运行的函数.上次给我的建议以及我看到的其他地方的建议是multiprocessing.freeze_support(在我的if __name__ == "__main__":块开始时打电话,我一直这样做,但是由于某种原因我突然再次遇到这个问题.还有什么可能导致这个?
更新:我已确认freeze_support()行的存在根本不会影响此问题.对它进行注释或取消注释它会产生完全相同的行为:主窗口的副本被打开并坐在那里什么都不做.这是在我的主要Python模块的最末端调用它的块:
if __name__ == '__main__':
freeze_support()
# (A bunch of commented-out lines)
main()
Run Code Online (Sandbox Code Playgroud) 我正在编写一个Python脚本来处理一些音乐数据.它应该通过比较它们的条目并匹配它们来合并两个独立的数据库.它几乎正常工作,但在比较包含特殊字符(即重音字母)的字符串时失败.我很确定它是ASCII与Unicode编码问题,因为我收到错误:
"Unicode相等比较无法将两个参数都转换为Unicode - 将它们解释为不相等"
我意识到我可以使用正则表达式来删除有问题的字符,但我正在处理大量数据并且依赖正则表达式使我的程序变得非常慢.有没有办法让Python正确比较这些字符串?这里发生了什么 - 有没有办法判断它是否将我的字符串存储为ASCII或Unicode?
编辑1:我使用的是Python v2.6.6.检查类型后,我发现一个数据库向我发出Unicode字符串,一个给出ASCII.所以这可能就是问题所在.我正在尝试将ASCII字符串从第二个数据库转换为Unicode,使用类似的行
line = unicode(f.readline().decode(latin_1).encode(utf_8))
Run Code Online (Sandbox Code Playgroud)
但这会产生如下错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 41: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
我不确定'ascii'编解码器为什么抱怨,因为我正在尝试从 ASCII 解码.有人可以帮忙吗?
我正在尝试在我用PyGTK编写的GUI菜单中实现最近打开的项目列表.我这样初始化菜单:
self.filemenu = gtk.Menu()
self.init_file_menu()
self.fileitem = gtk.MenuItem("File")
self.fileitem.set_submenu(self.filemenu)
menubar = gtk.MenuBar()
menubar.append(self.fileitem)
outerframe.pack_start(menubar, False, False)
def init_file_menu(self):
for widget in self.filemenu.get_children():
self.filemenu.remove(widget)
openitem = gtk.MenuItem("Open")
self.filemenu.append(openitem)
openitem.connect("activate", self.open_file)
self.filemenu.append(gtk.SeparatorMenuItem())
for recentitem in self.settings['recentfiles']:
item = gtk.MenuItem(os.path.basename(recentitem))
self.filemenu.append(item)
item.connect("activate", self.open_file, recentitem)
self.filemenu.show()
Run Code Online (Sandbox Code Playgroud)
self.settings ['recentitems']是一个在打开文件时被修改的双端队列; 然后再次调用init_file_menu.我的目标是清空菜单,然后按正确的顺序用正确的项目重新填充它.在启动时填充菜单时,此代码工作正常.但由于某些原因,当对Menu.remove的调用工作正常并清空菜单时,追加调用不会重新添加项目并且它仍然为空.如果我调用它的get_children方法,我看到它们都在内部,但接口尚未更新以反映这一点.如何刷新显示的菜单并使最近的项目列表按预期工作?
我也接受如何使用RecentChooserMenu小部件的方向,如果这是我正在寻找的.
在我与Python集成的C模块的部分代码中,我有一个char**(字符串数组),它被重复分配,填充已分配的字符串,然后再次释放和分配.一般模式是当某个函数被调用(来自Python)提供数组的新内容(作为列表)时,它遍历字符串数组,释放它们中的每一个,然后释放数组本身.然后它再次分配数组以保存新Python列表的内容,然后为每个要保留的字符串分配内存.
所有这些都说我在尝试释放列表中的一个字符串时遇到错误.这个错误是确定性的; 它始终是程序中同一个单词列表中的同一个单词,但是这个单词或单词列表没有什么特别之处.(它只是["CCellEnv","18","34"],这是与许多其他类似的格式)我尝试将一些调试代码添加到分配字符串的循环中; 这是产生错误的函数:
static PyObject* py_set_static_line(PyObject* self, PyObject* args)
{
int i;
//Free the old values of the allocated variables, if there are any
if (numStaticWords > 0)
{
for (i = 0; i < numStaticWords; i++)
{
printf("Freeing word %d = '%s'\n", i, staticWords[i]);
free(staticWords[i]);
}
free(staticWords);
free(staticWordMatches);
}
//Parse arguments
PyObject* wordList;
unsigned short numWords;
PyObject* wordMatchesList;
if (!PyArg_ParseTuple(args, "O!HO!", &PyList_Type, &wordList, &numWords, &PyList_Type, &wordMatchesList))
return NULL;
numStaticWords = numWords;
if (numStaticWords > 0)
{
staticWords = …Run Code Online (Sandbox Code Playgroud) 我试图在我的64位Windows 7 SP1安装上安装pygraphviz.python setup.py install通过更正setup.py文件的以下行,我能够获得通常的命令:
include_dirs = r"C:\Program Files (x86)\Graphviz2.38\include"
library_dirs = r"C:\Program Files (x86)\Graphviz2.38\lib\release\lib"
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试导入它时,我收到以下错误:
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pygraphviz
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pygraphviz\__init__.py", line 58, in <module>
from .agraph import AGraph, Node, Edge, Attribute, ItemAttribute
File "pygraphviz\agraph.py", line 26, in <module>
from . import …Run Code Online (Sandbox Code Playgroud) 我想让PyGTK Tree-view(耦合到List Store)的选择行不可选,如果可能的话,显示为灰色.
有没有办法做到这一点?
python ×8
gtk ×2
pygtk ×2
c ×1
graphviz ×1
numpy ×1
optimization ×1
profiling ×1
pygraphviz ×1
pyinstaller ×1
string ×1