在Python 3.6+中将字符串转换为二进制的更快方法? - python

我有数十亿行这样的字符串:1010101110100111100100101在内存中。
我需要将其转换为二进制整数列表。这将需要几分钟,似乎太慢了。
我的代码:

def string2vec(binary_str):
    return [int(binary_str[i:i + 8], base=2) for i in range(0, 64, 8)]

result= [ string2vec(l) for l in lines ]  # this code is slow


binary_str的长度为64,并且每8个二进制字符转换为1个二进制整数。

参考方案

binary_str的长度为64,并且每8个二进制字符转换为1个二进制整数。

所有这些字符串切片和Python循环都很昂贵。使用int(s,2)将整个二进制字符串转换为整数。然后使用array将整数作为64位整数进行管理,并转换为8位整数。您可以决定是否要为字节使用大端或小端的结果:

import random
import time
import array

ints = [random.randrange(1<<64) for _ in range(1000)] # Make 1000 integers
strs = [f'{n:064b}' for n in ints]                    # Represent as binary strings
print(f'{ints[0]:016X} {strs[0]}')

start = time.perf_counter()
ints2 = [int(s,2) for s in strs]  # convert all the strings to integers
a = array.array('Q',ints)         # Store in an array.  Q = quadwords (64-bit ints)
a.byteswap()                      # Optional if you want the opposite endian-ness of your machine.
b = array.array('B')              # Another array of bytes
b.frombytes(a.tobytes())          # Populate byte array with the bytes from the quadword array.
print(time.perf_counter() - start)

assert ints == ints2
print([hex(n) for n in b[:8]])

输出:

1E27DFA21406A338 0001111000100111110111111010001000010100000001101010001100111000
0.0005346000000372442
['0x1e', '0x27', '0xdf', '0xa2', '0x14', '0x6', '0xa3', '0x38']

我的机器是低端(大多数)。它将一千个64位二进制字符串转换为整数,将它们存储在数组中,字节交换它们以表示big-endian,然后将数组的字节重新映射为字节数组...所有这些在我的机器上为534.6微秒。我已经显示了第一个64个字符的字符串及其十六进制表示形式,以及最终结果的前8个字节。如果您确实拥有这些字符串的“十亿”,则每十亿个字符串大约需要9分钟,但不要立即将它们全部读入内存:)

在Python 3中获取未绑定方法对象的定义类 - python

说我想为一个类中定义的方法做一个装饰器。我希望该装饰器在被调用时能够在定义该方法的类上设置一个属性(以便将其注册到用于特定目的的方法列表中)。在Python 2中,im_class方法很好地实现了这一点:def decorator(method): cls = method.im_class cls.foo = 'bar' return …

在Python和C++之间传输数据而无需写入Windows和Unix文件 - python

我有预先存在的python和C ++文件,其中python文件定义了许多点,而C ++代码利用其现有库进行了所需的计算。最终产品是C ++代码写入的文件。我正在寻找一种在python中获取2000点列表的方法,将其传递给函数,然后执行所有C ++代码并输出我需要的文件。其他注意事项。这必须是可以在Linux或Windows机器上工作的东西,并且最少安装新插件…

如何锁定终端运行的perl,obj c,c++,python和ruby等脚本的源代码? - python

我想出售我在perl,obj c,c ++,python,ruby,bash,php等中制作的脚本等它们都在终端中运行。 (Linux)如何锁定源代码,以便无需人们访问源代码即可分发我的脚本..?换句话说,如何将在Terminal中运行的程序的源代码锁定,以便人们可以使用该程序(如果该代码已下载到他们的Linux机器上,但他们无法访问实际的源代码)?例:ex…

在python 3中使用单引号和双引号时出错 - python

使用os.system()函数时,我在python中遇到了EOL错误。以下是代码行生成错误:os.system("cat subdomains.txt | cut -d'"' -f1 ") 基本上,我试图使用分号[“]修改输出字符串(双引号) 参考方案 如果需要在带"的字符串中编写",则可…

在python ephem中,我无法获得某些星座的位置 - python

import ephem date = '2018/9/20' sun = ephem.Sun() sun.compute(date) print 'Sun in', list(ephem.constellation(sun))[1] moon = ephem.Moon() moon.compute(date) pri…