相关疑难解决方法(0)

建议使用哪种Python内存分析器?

我想知道我的Python应用程序的内存使用情况,并且特别想知道哪些代码块/部分或对象占用了大部分内存.Google搜索显示商业广告是Python Memory Validator(仅限Windows).

开源的是PySizerHeapy.

我没有尝试任何人,所以我想知道哪一个是最好的考虑:

  1. 提供大部分细节.

  2. 我必须对代码进行最少或不做任何更改.

python performance profiling memory-management

657
推荐指数
8
解决办法
22万
查看次数

我可以在Python列表上创建"视图"吗?

我有一个很大的清单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)

c python arrays list

41
推荐指数
5
解决办法
9473
查看次数

缓冲区和Memoryview对象为非C程序员解释

Python 2.7 为缓冲区和内存视图对象引入了一个新的API.

我阅读了关于它们的文档,我认为我得到了基本的概念(以原始形式访问对象的内部数据而不复制它,我想这意味着"更快,更少内存的"获取对象数据的方式),但要真正理解文档,读者应该具备超越我所拥有的C知识.

如果有人愿意花时间,我将非常感激:

  • 用"外行术语"解释缓冲区和内存视图对象
  • 描述了一个场景,其中使用缓冲区和memoryview对象将是"Pythonic方式"

c python python-2.x python-2.7 memoryview

10
推荐指数
1
解决办法
4632
查看次数

Python str视图

我有一个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的指针?

编辑:我们有buffermemoryview在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 memory python-2.x python-3.x

10
推荐指数
1
解决办法
1987
查看次数

快速数据从文件移动到某些StringIO

在Python中我有一个文件流,我想将它的一部分复制到一个StringIO.我想要尽可能快,最小的副本.

但如果我这样做:

data = file.read(SIZE)
stream = StringIO(data)
Run Code Online (Sandbox Code Playgroud)

我认为已完成2份,不是吗?从文件中复制一份数据,将另一份复制StringIO到内部缓冲区中.我可以避免其中一个副本吗?我不需要临时的data,所以我认为一份副本应该足够了

python stream

8
推荐指数
2
解决办法
1万
查看次数

使用缓冲区的最长公共前缀?

如果我有一个输入字符串和一个数组:

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:]其是_bes[2:]_be_or_not_to_be给予3( _be)
  • s[2:]其是_be_or_not_to_bes[8:]_not_to_be赋予1( _)

但是,如果s是巨大的,我不想在我做类似的事情时创建多个副本s[x:].经过几个小时的搜索,我发现函数缓冲区只维护输入字符串的一个副本,但我不确定在这种情况下在这里使用它的最有效方法是什么.有关如何实现这一目标的任何建议?

python string buffer text

6
推荐指数
1
解决办法
532
查看次数

python 3+的缓冲功能

我正在尝试使用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 buffer vtk python-3.x

5
推荐指数
1
解决办法
3714
查看次数