小编Jer*_*imo的帖子

来自生成器的 Python 字节对象

假设我有一个像

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我认为合适的对象,因为数据是只读的。

python arrays generator python-3.x

7
推荐指数
1
解决办法
3978
查看次数

如何动态创建 PyQt 属性

我目前正在寻找一种使用 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)

python properties pyqt

6
推荐指数
2
解决办法
2481
查看次数

标签 统计

python ×2

arrays ×1

generator ×1

properties ×1

pyqt ×1

python-3.x ×1