关于在python中使用 FlatBuffers ,我有两个问题,它们集中在如何以正确的方式使用它们而无需编写完全丧失其性能优势的代码。我想使用 FlatBuffers 在C#和python程序之间进行序列化和网络通信。我已经阅读了tutorial,python specifics和一些博客文章,这些博客文章将其他语言与flatbuffers一起使用,但找不到适用于python的语言。
1.)Flatbuffers用于快速序列化。对于python来说甚至如此吗? python的performance仅声明“Ok”,其他语言则表示“Great”。缺少特定时间。我知道python通常不如C或C++快,但是我们说话的速度有多慢?到它无法兑现的 promise 的性能优势(例如,与JSON相比)?也许有人已经使用python做过基准测试?如果没有,我将尝试编写一个比较C#和python之间的时间以及python中的flattbuffers vs json的时间。
2)由于“零拷贝”,所以速度很快。但是,这对于需要更改数据的程序意味着什么呢?特别是由于对象是不可变的。为了与它们一起工作,无论如何,我需要将这些值复制到对象的本地表示中。不会否达到那个目的?本教程说明了此示例以从FlatBuffer中读取:
import MyGame.Example as example
import flatbuffers
buf = open('monster.dat', 'rb').read()
buf = bytearray(buf)
monster = example.GetRootAsMonster(buf, 0)
hp = monster.Hp()
pos = monster.Pos()
最后两行不只是复制吗?
最佳答案
FlatBuffers的设计在获得最大速度方面非常偏爱诸如C/C++/Rust之类的语言。 Python的实现模仿了这些语言的功能,但是对于Python来说这是很不自然的,因此,如果纯粹为Python设计的话,这并不是最快的序列化程序设计。
我没有在Python上进行任何基准测试,但是Python特定的设计在许多情况下肯定会击败FlatBuffers-Python。 FlatBuffers设计甚至可以在Python中获胜的一种情况是稀疏或随机访问的大文件,因为它实际上并不会一次解压缩所有数据。
通常,您使用FlatBuffers是因为以更快的语言拥有了堆栈性能的关键部分,然后您还希望能够在其他地方使用Python处理数据。但是,如果您仅使用Python工作,FlatBuffers可能不是您的最佳选择(除非再次使用大型稀疏数据)。
更好的当然是不要首先使用Python进行繁重的工作。
关于python - 如何以正确的方式在python中使用 FlatBuffers ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56731661/