我在Python中实现了一个非阻塞读取器,我需要提高它的效率.
背景:我需要从一个子进程(从Popen()开始)读取大量输出并传递给另一个线程.读取该子进程的输出不得阻塞超过几毫秒(最好是读取可用字节所需的时间很短).
目前,我有一个实用程序类,它接受文件描述符(stdout)和超时.我select()和readline(1)直到三件事情之一碰巧:
然后我将缓冲的文本返回给调用方法,该方法用它来完成.
现在,对于真正的问题:因为我正在阅读如此多的输出,我需要提高效率.我想通过询问文件描述符有多少字节待处理来做到这一点readline([that many bytes]).它应该只是传递东西,所以我实际上并不关心新线,或者即使有任何.我可以问一下文件描述符可以读取多少字节,如果可以,怎么做?
我已经做了一些搜索,但是我很难找到要搜索的内容,更不用说是否可能了.
即使是正确方向的一点也会有所帮助.
注意:我正在开发Linux,但这对于"Pythonic"解决方案来说无关紧要.
我想这需要一些解释,所以请耐心等待......
我一次以4-6秒的亚秒级突发拍摄了2000多张图像.他们都被丢弃在同一个地方,所以我需要对它们进行排序.我需要通过突发对它们进行排序,但EXIF数据只提供一分钟的分辨率.爆发应该几乎完全相同,并且不同的爆发被设计为显着不同.
我需要查看每个图像,将其与下面的图像进行比较,看看它是否相似.如果它太不同,它必须来自另一个爆发,它需要进入一个新的文件夹,以及下面的任何类似的图像,依此类推.
我的想法是将当前图像的每个像素与下一个像素之间的差值的绝对值相加.一旦该总和达到阈值,那么这必然意味着它们来自不同的爆发(我可以做一些测试以找出一个好的阈值).
最大的问题是怎么样?PIL/Pillow支持这样的东西吗?有没有更好的方法来查看一个图像是否"大部分"与另一个图像相同?
我比使用任何特定技术更快地对它们进行排序感兴趣,因此欢迎使用其他方法.
......它几乎必须是Python.
编辑:这是一对样本图像,它们都应该在同一个文件夹中:

这些是来自以下爆发的两个图像,应该放在另一个文件夹中:

因为我无法使用 XSL IDE,所以我使用 lxml 编写了一个超级简单的 Python 脚本,以使用给定的 XSL 转换来转换给定的 XML 文件,并将结果写入文件。如下(略):
p = XMLParser(huge_tree=True)
xml = etree.parse(xml_filename, parser=p)
xml_root = xml.getroot()
print(xml_root.tag)
xslt_root = etree.parse(xsl_filename)
transform = etree.XSLT(xslt_root)
newtext = transform(xml)
with open(output, 'w') as f:
f.write(str(newtext))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
“lxml.etree.XSLTApplyError:无法评估'选择'表达式”
...但select我的 XSLT 中有相当多的表达式。在仔细查看隔离的代码块后,我仍然select不知道哪个失败了,或者为什么失败。
在不尝试调试代码的情况下,有没有办法从 lxml 中获取更多信息,例如行号或失败表达式中的引号?