【问题标题】:How to create a bytes or bytearray of given length filled with zeros in Python?如何在Python中创建一个给定长度的字节或字节数组,用零填充?
【发布时间】:2012-02-29 08:48:22
【问题描述】:

我找到的所有解决方案都是针对列表的。

谢谢。

【问题讨论】:

    标签: python bytearray


    【解决方案1】:

    这会给你 100 个零字节:

    bytearray(100)
    

    或者用非零值填充数组:

    bytearray([1] * 100)
    

    【讨论】:

    • 用某个不为零的值填充数组怎么样?
    【解决方案2】:

    对于bytes,也可以使用文字形式b'\0' * 100

    # Python 3.6.4 (64-bit), Windows 10
    from timeit import timeit
    print(timeit(r'b"\0" * 100'))  # 0.04987576772443264
    print(timeit('bytes(100)'))  # 0.1353608166305015
    

    更新1:使用constant folding in Python 3.7,来自的字面量现在快了近20倍。

    更新 2: 显然常量折叠是有限制的:

    >>> from dis import dis
    >>> dis(r'b"\0" * 4096')
      1           0 LOAD_CONST               0 (b'\x00\x00\x00...')
                  2 RETURN_VALUE
    >>> dis(r'b"\0" * 4097')
      1           0 LOAD_CONST               0 (b'\x00')
                  2 LOAD_CONST               1 (4097)
                  4 BINARY_MULTIPLY
                  6 RETURN_VALUE
    

    【讨论】:

    • 我是否误解了 timeit 的工作原理?当我输入以下内容时: >>> r'b"\0" * 100" python 返回:'b"\\0" * 100' 那么,这个例子真的是在计时创建 100 个元素吗?如果我输入 print (timeit("b'0x00' * 100")) 我得到了明显更长的时间。
    • @e-holder timeit 将字符串语句传递给compile,然后传递给exec。为什么将timeit 包装在print 函数中会对定时器输出产生显着影响?它只是在计时结束后打印一个浮点数。我无法复制。
    • 我的困惑是,前导 'r' 是否导致表达式仅仅是字符串的定义,而不是生成 100 个元素数组的表达式。如果我输入表达式 >>> b = r'b"\0" * 100' >>> b 我得到的只是一个字符串作为 b 的值。但是如果我输入表达式 >>> b = b"\0" * 100 >>> b 我会得到一个 100 元素数组作为 b 的值。你明白我为什么困惑了吗?
    • 好的。我错了。 print(timeit(r'b"\0" * 100000') 需要更长的时间,所以它不仅仅是构建一个字符串。
    猜你喜欢
    • 1970-01-01
    • 2019-07-18
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    相关资源
    最近更新 更多