簡體   English   中英

將二進制字符串轉換為二進制數組(1 和 0 的數組)的最快方法

[英]Fastest Way to convert a Binary String to Binary Array (Array of 1 and 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. 將位串(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'\x01\x00\x01\x01\x01')
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'\x00\x01')

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM