如何解决使用 `ctypes.string_at` 检查 `memoryview` 对象的内存
在 Python 中,memoryview
获取 bytes
、bytearrays
或任何支持缓冲区协议的内部记忆的查看器。如果我使用 ctypes.string_at
获取 memoryview
对象显示的内存地址处的值,则无法获取有关原始对象的任何信息,例如(交互式控制台):
>>> from ctypes import string_at
>>> from sys import getsizeof
>>> a = b'abc'
>>> b = memoryview(a)
>>> b
<memory at 0x7fb8e99c8408>
>>> string_at(0x7fb8e99c8408,getsizeof(a))
b'\x02\x00\x00\x00\x00\x00\x00\x00@\x0e\x8a\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00H\x10\x96\xe9\xb8\x7f\x00\x00\xff\xff\xff\xff'
结果没有显示b'abc'
的证据。那么内存0x7fb8e99c8408
在memoryview
对象的对象字符串中究竟是什么意思呢?我们可以直接验证内存来证明memoryview
确实反映了内部内存吗?
解决方法
这是内存中 import heapq
def mergeArys(srtd_arys):
heap = []
srtd_iters = [iter(x) for x in srtd_arys]
# put the first element from each srtd array onto the heap
for idx,it in enumerate(srtd_iters):
elem = next(it,None)
if elem:
heapq.heappush(heap,(elem,idx))
res = []
# the number of tims that the current number has been seen
times_seen = 0
# the lowest number from the heap - currently checking if the first numbers in all sub-lists are equal to this
lowest = heap[0][0] if heap else None
# collect results in nlogK time
while heap:
elem,ary = heap[0]
unbench_all = True
if lowest != elem or ary != times_seen:
if lowest == elem:
heapq.heappop(heap)
it = srtd_iters[ary]
nxt = next(it,None)
if nxt:
heapq.heappush(heap,(nxt,ary))
else:
heapq.heappop(heap)
times_seen += 1
if times_seen == len(srtd_arys):
res.append(elem)
else:
unbench_all = False
if unbench_all:
for unbenched in range(times_seen):
unbenched_it = srtd_iters[unbenched]
nxt = next(unbenched_it,unbenched))
times_seen = 0
if heap:
lowest = heap[0][0]
return res
if __name__ == '__main__':
a1 = [[1,3,5,7],[1,1,4,7,9]]
a2 = [[1,1],2,3]]
for arys in [a1,a2]:
print(mergeArys(arys))
对象的地址,而不是字符串对象本身(假设 CPython 实现)。要查看字符串字节,您需要 def mergeArys(srtd_arys):
heap = []
srtd_iters = [iter(x) for x in srtd_arys]
# put the first element from each srtd array onto the heap
for idx,idx))
res = []
# collect results in nlogK time
while heap:
elem,ary = heap[0]
lowest = elem
keep_elem = True
for i in range(len(srtd_arys)):
elem,ary = heap[0]
if lowest != elem or ary != i:
if ary != i:
heapq.heappop(heap)
it = srtd_iters[ary]
nxt = next(it,None)
if nxt:
heapq.heappush(heap,ary))
keep_elem = False
i -= 1
break
heapq.heappop(heap)
if keep_elem:
res.append(elem)
for unbenched in range(i+1):
unbenched_it = srtd_iters[unbenched]
nxt = next(unbenched_it,None)
if nxt:
heapq.heappush(heap,unbenched))
if len(heap) < len(srtd_arys):
heap = []
return res
或 memoryview
:
id(s)
如果您对输出感到好奇,可以阅读有关 Python here 中字符串对象表示的更多信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。