Python:使用';是';,不是'==';(即通过引用)

Python:使用';是';,不是'==';(即通过引用),python,list,Python,List,问题: 在python中,list.index(a)将返回a==list[index]为真的任何索引。但是我需要找到a是list[index]的索引,并尽快找到(速度至关重要)。我该怎么做呢 背景: 也许我的编程方式不对。为了以防万一,我需要解决上述问题: 我有一些文本,我必须能够插入/删除字符非常快。所以,我使用一个字符列表(大约一百万)而不是字符串 此外,在索引上执行任何给定的插入/删除操作后,我必须很快知道该索引前面有多少换行符。我尝试了列表[0:index].count(换行),但速度太

问题:

在python中,
list.index(a)
将返回
a==list[index]
为真的任何索引。但是我需要找到
a是list[index]
的索引,并尽快找到(速度至关重要)。我该怎么做呢

背景:

也许我的编程方式不对。为了以防万一,我需要解决上述问题:

我有一些文本,我必须能够插入/删除字符非常快。所以,我使用一个字符列表(大约一百万)而不是字符串

此外,在索引上执行任何给定的插入/删除操作后,我必须很快知道该索引前面有多少换行符。我尝试了
列表[0:index].count(换行)
,但速度太慢了。因此,我尝试使用上述问题的解决方案来实现第二种方法

当然,从定义上讲,这种在每次操作后解决问题的方法可能太慢了。但是我想不出任何快速的方法来维护信息(为了查找,所以我不必每次都计算出来),因为每次插入/删除字符时,索引和换行数都会发生变化

编辑:

这是到目前为止我的大致解决方案。使用cProfile,我发现执行
chars[0:index].count()
,可能需要1/50的时间,但仍然不够快:

#Initialized once, and then maintained after every change.
chars = [['\n'],['a'],['b'],['\n'],.... ]
newlines = [newline for newline in chars if newline == ['\n']]

#called every time I need the count of newlines preceding 'index'
def newlinecount(index):

    #find closest preceding newline
    previousNewlineIndex = index
    while not chars[previousNewlineIndex ] == ['\n']:
        previousNewlineIndex -= 1
    previousNewline = chars[previousNewlineIndex]

    #find position of 'previousNewline' in 'newlines', and thus newlinecount
    for count, newline in enumerate(newlines):
        if newline is previousNewline:
            return count + 1 #(add 1 because 'count' starts from 0)
谢谢

在python中,
list.index(a)
将返回
a==list[index]
为真的任何索引。但是我需要找到
a是list[index]
的索引,并尽快找到(速度至关重要)

即使
list.index()
是这样工作的,您也不会从中获得太多好处。因为Python中没有字符类型,所以应该将字符存储为整数,而不是一个字符串。整数的比较方法与
=
is
相同

我有一些文本,我必须能够插入/删除字符非常快。所以,我使用一个字符列表(大约一百万)而不是字符串

在列表中存储字符不是允许快速插入和删除的方法。Python列表是一个动态数组,而不是链表,因此添加或删除项是O(n)。例如,如果要删除
范围(10)
中的
5
,则需要将项目
6
9
向左移动一个位置

此外,在索引上执行任何给定的插入/删除操作后,我必须很快知道该索引前面有多少换行符

我建议您将换行符的索引保存在单独的数据结构中,并在每次添加或删除换行符时进行更新。否则,您将始终必须扫描整个列表直到当前点


由于Python是一种非常高级的语言,我怀疑用普通Python解决问题是否能获得很好的性能。

我认为,您可能需要维护两个独立的数据结构:

  • 字符列表:字符列表本身。对此的操作将是
  • 索引列表:另一个排序列表,包含换行符的位置(索引)
插入和删除操作将在这两种数据结构上操作。
插入/删除字符时,将增加/减少索引列表中的相应元素。在这之后,
index\u list.index(new\u char\u index)
将返回插入/删除字符之前的换行数

我不确定是否正确,但是如何将文本视为一系列行呢

如果将1Mb文本存储为字符串列表(每行一个字符串),则可以非常快速地处理插入/替换(字符串会很短),并且可以使用列表索引跟踪文本给定点之前/之后的换行字符数


这是否有任何帮助,或者我是否误解了您的意图?

当然,如果这是一个字符列表,并且您想要查找换行符,那么您想要的默认行为是
索引
:您想要查找与特定换行符不相同的等于换行符的字符。无论如何,你不会用Python编码的循环来击败list.count(),如果我不清楚的话,你想找到换行符的道歉。我需要找出列表中位置前面有多少新行。另外,是的,我可以击败list.count(),我已经做到了(对不起,我将在接下来的几分钟内发布该代码)!只是还不够快……插入/删除列表中间的值不是很快。它需要移动插入索引后面的所有数据。哦,是的,对不起,我忽略了在调用count之前对字符串进行切片。在这种情况下,如果你避开切片,几乎可以肯定你可以做得更快。然而,避免大量的列表将是一个更好的方法。@Jeff:没有“慢”这个词,只有“足够快”。字符串连接一点也不“非常”慢,创建不必要的临时字符串是(例如,
“a”+“b”+“c”
创建一个中间
“ab”
)。如果你用
timeit
来测量它,你会发现
L[0:500]+L[501:
对于字符串来说比整数列表快16倍左右我建议您将换行符的索引保存在一个单独的数据结构中……“这不需要我每次插入/删除一个字符时编辑大约50000个索引吗?另外,我很欣赏你的链接列表的想法。在python中如何实现这一点?第二,我还能使用索引吗?忘了列表吧。在Python中,您可以通过将繁重的工作委托给用C编写的例程来提高速度