На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD
  
    > python: как !!быстро!! сравнить 2 списка , Как максимально быстро сравнить два списка.
      Как максимально быстро сравнить два списка.

      Суть задачи в следующем: у меня есть список (spisok) длинны n. Он состоит из списков некоторых слов.
      Например [[a, b, c], [c, k], [3, i, l, d, k], ...]
      Мне нужно сравнить между собой все елементы spisok - сравнить значит подсчитать какие слова в каждых из двух елементов совпадают ((n*n + n)/2 операций).
      Загвоздка в том что n у меня очень большое (десятки тысяч), и потому очень важно найти максимально быструю ф-ю сравнения двух списков из слов.

      У меня есть 2 версии этой ф-ии (см. код), которые приблизительно равные по быстродействию.
      Список длинны n = 300 они обрабатывают за 200 и 203 секунды соответственно (у меня 600 пентиум и 512 оперативной памяти), но это чересчур медленно для моей задачи.

      Подскажите пожалуйста ф-ю с быстродействием повыше чем мои.

      ExpandedWrap disabled
        # -*- coding: windows-1251 -*-
        #    сравниваю еффективность разных ф-й для подсчета схожести всех елементов 2-х списков
         
        import time, random
        from sets import Set
         
        def list_similarity1 (list1, list2):
            s1 = Set(list1)
            s2 = Set(list2)
            return list(s1 & s2)
         
        def list_similarity2 (list1, list2):
            return [i for i in list1 if i in list2]
         
        def check_similarity (check_function, spisok, message):
            """получаем ф-ю и список, возвращаем время проверки"""
            print '\n', message
            spisok_size = len(spisok)
            t = time.time()
            for i in range(spisok_size):
                for j in range(i+1, spisok_size):
                    list_similarity1(spisok[i], spisok[j])
            print time.time() - t, ' seconds'
         
         
        #генерация списков
        print 'generation test set'
        spisok = []
        spisok_size = 300
        all_values = [random.randint(0, 1000000) for i in range(1000000)]
        for i in range(spisok_size):
            spisok.append(random.sample(all_values, 1000))
         
        #тестирую ф-ии
        print 'testing'
        print (spisok_size * spisok_size + spisok_size)/2, ' operations'
        check_similarity(list_similarity1, spisok, 'function with sets')
        check_similarity(list_similarity2, spisok, 'function with lists')
        Пока у меня только одно предложение вынести критические по скорости куски кода в отдельную библиотеку на Си!
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0164 ]   [ 15 queries used ]   [ Generated: 3.05.24, 18:57 GMT ]