【问题标题】:Is the memoryview object used correctly in this snippet?此代码段中是否正确使用了 memoryview 对象?
【发布时间】:2019-04-03 11:23:06
【问题描述】:

我需要找出某个文本中出现的所有回文。我将从外部文件中提取数据。我需要注意数据的内存高效处理,因此我使用了 memoryview 对象。但是,我需要对 memoryview 对象执行一些字符串操作,所以我使用了 tobytes() 方法。这是在不复制数据的情况下处理这些对象的正确方法吗?

from collections import Counter

palindrome = []
# read file as binary data
with open('some_text.txt', 'rb') as fr:

    # create memoryview object
    data = memoryview(fr.read())

    # applying the tobytes() method
    text = data.tobytes()

    # split the sentences to words
    for word in text.split():
        # append to palindrome list if true
        if is_palindome(word):
            palindrome.append(word)

    # return a Counter object with the palindromes and the number of occurences
    palindrome = Counter(palindrome)
    print(palindrome)

【问题讨论】:

    标签: python memory-efficient memoryview


    【解决方案1】:

    您可以只使用来自fr.read()bytes

        with open('some_text.txt', 'rb') as f:
            b = f.read()
            print(b.__class__, id(b), len(b))
            data = memoryview(b)
            text = data.tobytes()
            print(text.__class__, id(text), len(text))
    

    可能的输出:

    <class 'bytes'> 47642448 173227
    <class 'bytes'> 47815728 173227
    

    对于 CPython,id() 返回内存中对象的addres。所以data.tobytes() 在这种情况下会返回一个副本。

    考虑使用文本模式

    with open('some_text.txt', 'r') as f:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 1970-01-01
      • 2012-06-30
      • 2023-03-17
      相关资源
      最近更新 更多