将二进制字符串转换为二进制数组(包含1和0的数组)的最快方法



我正试图找到最快的方法将二进制字符串转换为整数数组01。我目前使用python 3.8,并有以下两个函数来获取这样的数组:

import numpy as np
from typing import Literal, Sequence
def string_to_array(Bin_String):
Bin_array=[int(Bin_String[i],2) for i in range(len(Bin_String))]
return Bin_array
def string_to_array_LtSq(string: Sequence[Literal['0', '1']]) -> np.ndarray:
return np.array([int(c) for c in string])

字符串的长度为1024,string_to_array_LtSq函数接受20微秒时间内低于其他(平均370微秒时间内)虽然我不明白为什么它更快,因为都使用int函数。

但是这是代码的重要部分,所以在python中有没有更快的方法?

也有可能做的速度在任何其他语言(例如c语言)?我可能会改用那种语言。

谢谢。

相关文章:

  1. 将Bitstring(1和0的字符串)转换为numpy数组

尝试:

s = '0011'
print(np.frombuffer(s.encode("ascii"), dtype="u1") - 48)

基准:

import numpy as np
from timeit import timeit
s = "1011" * 256  # length = 1024

def f1():
return np.frombuffer(s.encode("ascii"), dtype="u1") - 48

def f2():
return np.array([int(c) for c in s])

def f3():
return list(map(int, s))

def f4():
return [int(c) for c in s]

t1 = timeit(f1, number=1_000)
t2 = timeit(f2, number=1_000)
t3 = timeit(f3, number=1_000)
t4 = timeit(f4, number=1_000)
print(t1)
print(t2)
print(t3)
print(t4)

打印:

0.00223864201689139
0.18963027599966154
0.10751374304527417
0.13433810899732634

编辑:添加只创建python列表的函数(而不是np.array)

bytearray似乎比Andrej的NumPy解决方案更快。bytes可用于快速的list解决方案。1024位的次数(只显示前5位):

f1   2.7 μs  [1 0 1 1 1]
f2   2.0 μs  bytearray(b'x01x00x01x01x01')
f3   7.6 μs  [1, 0, 1, 1, 1]

基于Andrej的代码(在线试试!):

import numpy as np
from timeit import timeit
s = "1011" * 256  # length = 1024

def f1():
return np.frombuffer(s.encode("ascii"), dtype="u1") - 48

table = bytearray.maketrans(b'01', b'x00x01')
def f2():
return bytearray(s, "ascii").translate(table)

def f3():
return [*s.encode().translate(table)]

for _ in range(3):
for f in f1, f2, f3:
t = timeit(f, number=1_000)
t = '%5.1f μs ' % (t * 1e3)
print(f.__name__, t, f()[:5])
print()