我想知道我的Python应用程序的内存使用情况,并且特别想知道哪些代码块/部分或对象占用了大部分内存.Google搜索显示商业广告是Python Memory Validator(仅限Windows).
我没有尝试任何人,所以我想知道哪一个是最好的考虑:
提供大部分细节.
我必须对代码进行最少或不做任何更改.
我有一个很大的清单l.我想从元素4到6创建一个视图.我可以使用序列切片来完成.
>>> l=range(10)
>>> lv=l[3:6]
>>> lv
[3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
然而,lv是l片的副本.如果我更改基础列表,则lv不会反映更改.
>>> l[4] = -1
>>> lv
[3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
反之亦然我希望修改lv也反映在l中.除此之外,列表大小不会改变.
我不期待建立一个大班来做这件事.我只是希望其他Python大师可能知道一些隐藏的语言技巧.理想情况下,我希望它能像C中的指针算术一样.
int lv[] = l + 3;
Run Code Online (Sandbox Code Playgroud) Python 2.7 为缓冲区和内存视图对象引入了一个新的API.
我阅读了关于它们的文档,我认为我得到了基本的概念(以原始形式访问对象的内部数据而不复制它,我想这意味着"更快,更少内存的"获取对象数据的方式),但要真正理解文档,读者应该具备超越我所拥有的C知识.
如果有人愿意花时间,我将非常感激:
我有一个str大约1GB的长度:
>>> len(L)
1073741824
Run Code Online (Sandbox Code Playgroud)
我需要从特定索引中取出许多字符串,直到字符串结束.在C我会这样做:
char* L = ...;
char* p1 = L + start1;
char* p2 = L + start2;
...
Run Code Online (Sandbox Code Playgroud)
但在Python中,切片字符串会str使用更多内存创建一个新实例:
>>> id(L)
140613333131280
>>> p1 = L[10:]
>>> id(p1)
140612259385360
Run Code Online (Sandbox Code Playgroud)
为了节省内存,我如何创建一个类似str的对象,实际上是指向原始L的指针?
编辑:我们有buffer和memoryview在Python 2和Python 3中,但memoryview没有展示与stror或相同的界面bytes:
>>> L = b"0" * 1000
>>> a = memoryview(L)
>>> b = memoryview(L)
>>> a < b
Traceback (most recent call last):
File "<stdin>", line 1, in …Run Code Online (Sandbox Code Playgroud) 在Python中我有一个文件流,我想将它的一部分复制到一个StringIO.我想要尽可能快,最小的副本.
但如果我这样做:
data = file.read(SIZE)
stream = StringIO(data)
Run Code Online (Sandbox Code Playgroud)
我认为已完成2份,不是吗?从文件中复制一份数据,将另一份复制StringIO到内部缓冲区中.我可以避免其中一个副本吗?我不需要临时的data,所以我认为一份副本应该足够了
如果我有一个输入字符串和一个数组:
s = "to_be_or_not_to_be"
pos = [15, 2, 8]
Run Code Online (Sandbox Code Playgroud)
我试图找到pos引用原始数组的连续元素之间的最长公共前缀s.我想获得以下输出:
longest = [3,1]
Run Code Online (Sandbox Code Playgroud)
我获得此方法的方法是计算以下对中最长的公共前缀:
s[15:]其是_be与s[2:]被_be_or_not_to_be给予3( _be)s[2:]其是_be_or_not_to_be与s[8:]被_not_to_be赋予1( _)但是,如果s是巨大的,我不想在我做类似的事情时创建多个副本s[x:].经过几个小时的搜索,我发现函数缓冲区只维护输入字符串的一个副本,但我不确定在这种情况下在这里使用它的最有效方法是什么.有关如何实现这一目标的任何建议?
我正在尝试使用vtk_show打开vtk窗口,但是每次执行此操作时,我的Ipython控制台都会崩溃,这显然是因为Ipython无法显示外部窗口,而这正是vtk_show的作用。我在Google上搜索了一个解决方案,但它是为python2编写的(我正在使用python 3.6.3)。这是我找到的解决方案:
import vtk
from IPython.display import Image
def vtk_show(renderer, width=400, height=300):
"""
Takes vtkRenderer instance and returns an IPython Image with the
rendering.
"""
renderWindow = vtk.vtkRenderWindow()
renderWindow.SetOffScreenRendering(1)
renderWindow.AddRenderer(renderer)
renderWindow.SetSize(width, height)
renderWindow.Render()
windowToImageFilter = vtk.vtkWindowToImageFilter()
windowToImageFilter.SetInput(renderWindow)
windowToImageFilter.Update()
writer = vtk.vtkPNGWriter()
writer.SetWriteToMemory(1)
writer.SetInputConnection(windowToImageFilter.GetOutputPort())
writer.Write()
data = str(buffer(writer.GetResult()))
return Image(data)
Run Code Online (Sandbox Code Playgroud)
我在尝试使用bufferpython2 的内置函数时遇到错误,但是由于此函数在python3 +上不存在,因此我陷入了困境。如果有人可以帮助我,我将非常感激。提前致谢!
python ×7
buffer ×2
c ×2
python-2.x ×2
python-3.x ×2
arrays ×1
list ×1
memory ×1
memoryview ×1
performance ×1
profiling ×1
python-2.7 ×1
stream ×1
string ×1
text ×1
vtk ×1