Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 需要帮助加速此功能吗_Python - Fatal编程技术网

Python 需要帮助加速此功能吗

Python 需要帮助加速此功能吗,python,Python,输入:各种职位的列表 [['61097', '12204947'], ['61097', '239293'], ['61794', '37020977'], ['61794', '63243'], ['63243', '5380636']] 输出:包含列表中唯一数字计数的排序列表 [4, 3, 3, 3, 3] 想法相当简单,我有一个列表,其中每个列表包含可变数量的位置(在我们的示例中,每个列表中只有2个,但最多有10个列表)。我想循环遍历每个列表,如果存在任何其他包含相同编号的列表

输入:各种职位的列表

[['61097', '12204947'],
 ['61097', '239293'],
 ['61794', '37020977'],
 ['61794', '63243'],
 ['63243', '5380636']]
输出:包含列表中唯一数字计数的排序列表

[4, 3, 3, 3, 3]
想法相当简单,我有一个列表,其中每个列表包含可变数量的位置(在我们的示例中,每个列表中只有2个,但最多有10个列表)。我想循环遍历每个列表,如果存在任何其他包含相同编号的列表,则该列表将附加到原始列表中

示例:从上面获取输入数据并使用以下代码:

def gen_haplotype_blocks(df):
    counts = []
    for i in range(len(df)):
        my_list = [item for item in df if any(x in item for x in df[i])]
        my_list = list(itertools.chain.from_iterable(my_list))
        uniq_counts = len(set(my_list))
        counts.append(uniq_counts)
        clear_output()
        display('Currently Running ' +str(i))
    return sorted(counts, reverse=True)
我得到了预期的输出。在这种情况下,当我在第一个列表中循环时,我发现我的第二个列表都包含
'61097','12204947']
,所以这些who列表连接在一起,形成
['61097','12204947','61097','239293']
。这是针对输出以下内容的每个列表执行的:

['61097', '12204947', '61097', '239293']
['61097', '12204947', '61097', '239293']
['61794', '37020977', '61794', '63243']
['61794', '37020977', '61794', '63243', '63243', '5380636']
['61794', '63243', '63243', '5380636']
一旦这个列表完成,我就会计算每个列表中唯一值的数量,将其附加到另一个列表中,然后对最终列表进行排序并返回

所以在
['61097','12204947','61097','239293']
的情况下,我们有两个'61097',一个'12204947'和一个'239293',它们等于3个唯一的数字

虽然我的代码可以工作,但速度非常慢。运行了近两个小时,但仍仅在线~44k

我正在寻找一种方法来大大加快这个功能。最好不改变原始数据结构。我对python非常陌生


提前谢谢

说“相当多”不确定你期望多少,但从一开始就将你的内部
列表
s转换为
集合
s应该会加快速度。在我的测试中,以下各项工作速度大约快2.5倍:

def gen_haplotype_blocks_improved(df):
    df_set = [set(d) for d in df]
    counts = []
    for d1 in df_set:
        row = d1
        for d2 in df_set:
            if d1.intersection(d2) and d1 != d2:
                row = row.union(d2)
        counts.append(len(row))
    return sorted(counts, reverse=True)  

大大提高了程序的速度,尤其是对于较大的数据集。关键是使用哈希表或Python术语中的字典来存储不同的数字作为键,每个唯一数字的行作为值存在。然后在第二步中,根据字典合并每行的列表并计算唯一元素

def gen_haplotype_blocks(input):
    unique_numbers = {}

    for i, numbers in enumerate(input):
        for number in numbers:
            if number in unique_numbers:
                unique_numbers[number].append(i)
            else:
                unique_numbers[number] = [i]

    output = [[] for _ in range(len(input))]

    for i, numbers in enumerate(input):
        for number in numbers:
            for line in unique_numbers[number]:
                output[i] += input[line]

    counts = [len(set(x)) for x in output]
    return sorted(counts, reverse=True)

理论上,算法的时间复杂度是O(N*N),N是输入列表的大小。因为您需要将每个列表与所有其他列表进行比较。但在这种方法中,复杂度是O(N),对于更大的数据集,这应该要快得多。取舍是额外的空间复杂性。

只是一句话:在python中,对于范围内的i(len(thing)),您(通常)不需要执行
。大多数
东西
都支持
这样你就可以在东西中为我做
。你确定
[4,3,3,3,3]
是正确的吗?我没有看到任何数字出现4次。@chrisz对于第一行
['61097',12204947']
我们检查了所有其他行,发现只有第二行
['61097',239293']
至少包含一个彼此相同的数字(61097)。我们将这两个列表合在一起得到
['61097'、'12204947'、'61097'、'239293']
,当您计算其中的唯一数字时,它是3。第二行也是这样,唯一的数字也是3。对于第三行,我们的合并列表是
['61794','37020977','61794','63243']
,因为第3行和第4行至少有一个数字在两个列表中。@Nathan当您执行第4行时,您将合并列表4,3和5(因为第4行的61794在列表3中,63243在列表5中)以获得
['61794', '37020977', '61794', '63243', '63243', '5380636']
。唯一的numebr是61794、370…、63243和5380636。这是4个数字。@jjj很高兴知道,谢谢!这实际上比OP和我的方法都快,但由于某些原因,结果不正确。它对问题中的示例列表产生相同的结果,但对其他列表则失败(例如,尝试复制一个元组)@Selcuk,很好!我在上一个答案中试图避免合并列表,但没有效果。我已经更新了代码,这一个对我来说很好。