假设我有一个像
gen = (i*2 for i in range(100))
Run Code Online (Sandbox Code Playgroud)
我现在想创建一个包含生成器产生的所有值的字节对象。我可以执行以下操作:
b = bytes(gen)
Run Code Online (Sandbox Code Playgroud)
我现在的问题是:由于bytes
对象是不可变的,在这种情况下内存分配如何工作?我是否必须假设对于生成器产生的每个元素,都会bytes
创建一个新对象,并将先前的内容加上另一个元素复制到其中?这将是非常低效的,尤其是对于更大长度的生成器。而且由于生成器不提供任何长度信息,似乎没有任何其他方式可以在内部预先分配所需的内存。
再说一次,在尽可能少的内存使用情况下,实现这一目标的更好方法是什么?如果我先使用(可变的)bytearray
并将其转换为bytes
对象?
b = bytes(bytearray(gen))
Run Code Online (Sandbox Code Playgroud)
甚至是一个清单?
b = bytes(list(gen))
Run Code Online (Sandbox Code Playgroud)
但这看起来有点奇怪和违反直觉......
背景:我使用的特定生成器通过来自另一个模块 (.pyd) 的 C-API 一次读取一个字节(作为 0..255 中的 Python 整数),并且序列的总长度事先已知,向上到那里的 2**25 个字节。我的读出函数应该收集这些并返回一个bytes
我认为合适的对象,因为数据是只读的。
我目前正在寻找一种使用 PyQt5 的QWebEngineView使用 Python 和 HTML/CSS/JS 创建 GUI 桌面应用程序的方法。
在我的小演示应用程序中,我使用QWebChannel发布 Python QObject到 JavaScript 端,以便数据可以共享和来回传递。到目前为止,共享和连接插槽和信号工作正常。
我在同步简单(属性)值时遇到了困难。从我读过的内容来看,要走的路是通过装饰的 getter 和 setter 函数在共享 QObject 中实现一个 pyqtProperty,并在 setter 中发出一个额外的信号,用于在值发生变化时通知 JavaScript。下面的代码显示了这一点,到目前为止它工作正常:
import sys
from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebChannel import QWebChannel
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage
class HelloWorldHtmlApp(QWebEngineView):
html = '''
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<script src="qrc:///qtwebchannel/qwebchannel.js"></script>
<script>
var backend;
new QWebChannel(qt.webChannelTransport, function (channel) {
backend = channel.objects.backend;
});
</script> …
Run Code Online (Sandbox Code Playgroud)