此代码段中是否正确使用了memoryview对象?

问题描述 投票:1回答:1

我需要找到在特定文本中出现的所有回文。我将从一个外部文件中提取数据。我需要注意数据的内存有效处理,因此我使用了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个回答
0
投票

您可以只使用bytes中的fr.read()

    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:

© www.soinside.com 2019 - 2024. All rights reserved.