将二进制文件中的Java Double读入Python

将二进制文件中的Java Double读入Python,java,python,io,binaryfiles,data-conversion,Java,Python,Io,Binaryfiles,Data Conversion,我有几个Java矩阵,我希望尽可能高效地将它们转换为Python,而不需要Java和Python方面的标准库 目前,我使用writeDouble函数将它们序列化到文件中,以逐个写出条目,并使用writeInt写入矩阵的维度。现在我想把这些矩阵读回Python。我可以使用struct.unpack获得整数,但是Java的双精度序列化与struct.unpack可以实现的算法不一致 如何以可写双工使用的二进制格式解码Java double?我甚至很难找到可写双工使用的编码规范。你设计得太多了;而相关

我有几个Java矩阵,我希望尽可能高效地将它们转换为Python,而不需要Java和Python方面的标准库

目前,我使用writeDouble函数将它们序列化到文件中,以逐个写出条目,并使用writeInt写入矩阵的维度。现在我想把这些矩阵读回Python。我可以使用struct.unpack获得整数,但是Java的双精度序列化与struct.unpack可以实现的算法不一致


如何以可写双工使用的二进制格式解码Java double?我甚至很难找到可写双工使用的编码规范。

你设计得太多了;而相关的方法都是针对Java对象的,所以可以将其作为Java对象重新读取。如果您只需要传输数据,只需将它们写成文本或字节,然后再读回即可。常用的格式有、、和


如果您所做的只是尝试传输一个double列表,那么您甚至可以每行写出一个double,然后用Python将它们重新读入。

我已经更新了这个问题。我目前正在使用CSV,但对于我正在使用的矩阵大小,编写和读取都需要大量的时间和空间。我希望能够更高效地读写,因此使用writeDouble。为什么您认为Java序列化会花费更少的时间或空间来编写?必须写出相同的数据。ProtoBuf是一种二进制格式,对于您的用例来说可能更紧凑一些,但您不能合理地希望避免写入n个数字。因为它确实占用更少的时间和空间:想象一下,将1.26亿个双倍数中的每一个转换为字符串并将其写出,而不是将它们作为字节转储。根据经验,将CSV加载到Python中要比使用struct.unpack从二进制文件加载行、拆分行、然后从字符串转换为数字慢得多。我的理解是Protobuf需要一个外部库。我真的只需要一个例程来解析Java写出的二进制格式,以便在Python中恢复double。如果不能做到这一点,一个关于Java使用的算法的显式语句就太好了。Java序列化有您不需要的开销。同样,ProtoBuf是一种为提高速度而设计的二进制格式。如果CSV太慢,请使用ProtoBuf或其他现有的二进制格式,不要重新发明轮子。如问题中所述,我不想使用外部库。此外,我还没有经历过写双工的慢-慢-有什么开销?除了错误检查之外,这个调用看起来只是增加一个计数器并将原始字节输出到文件中。我通过谷歌搜索writeDouble的源代码发现了Java在做什么:它正在调用Java.lang.Double.Double tolongbits,这些注释似乎足够有用,可以帮助我们了解如何加载其输出并转换为Double