2010-07-27 3 views
0

Что бы кто-нибудь считал наиболее эффективным способом слияния двух наборов данных с помощью Python?Слияние двух наборов данных в Python эффективно

Немного предыстории - этот код будет принимать 100K + записи в следующем формате:

{user: aUser, transaction: UsersTransactionNumber}, ... 

и используя следующие данные

{transaction: aTransactionNumber, activationNumber: assoiciatedActivationNumber}, ... 

создать

{user: aUser, activationNumber: assoiciatedActivationNumber}, ... 

NB Эти не являются словарями Python, просто самое близкое к изображению re форма шнура.

Так что теоретически все, что я пытаюсь сделать, это создать представление о двух списках (или таблицах), соединяющих общий ключ - сначала это указывает на наборы (союзы и т. Д.), Но прежде, чем я начну изучать эти в глубине, они могут идти? До сих пор я чувствовал, что это может быть реализовано как:

  1. Создать список словарей и перебирать список сравнения ключа каждый раз, однако, в худшем случае это может работать до LEN (inputDict) * LEN (outputDict) < - Не знаете?

  2. Манипулировать данными в виде таблицы SQLite в памяти? Peferrably не так, как если бы не было строгого требования к Python 2.4, это облегчило бы жизнь.

  3. Какой-то набор на основе магии?

Разъяснение

Вся цель этого сценария заключается в обобщении, фактические наборы данных поступают из двух различных источников. Номера пользователей и транзакций поступают в виде CSV в качестве результата теста производительности, который проверяет пропускную способность кода активации электронной почты. Второй набор данных - это разбор тестовых почтовых ящиков, содержащих идентификатор транзакции и код активации. Результатом этого теста является CSV, который будет перекачиваться обратно в этап 2 теста производительности, активируя учетные записи пользователей, используя коды активации, которые были в паре.

Извините, если мои записи для записей были вводят в заблуждение, я обновил их соответствующим образом.

Спасибо за ответы, я собираюсь дать две идеи попробовать:

  • Сортировка списков первой (я не знаю как дорого это)
  • Создание словаря с transactionCodes как ключ затем сохранить имя пользователя и код активации в списке в качестве значения

Пе rformance не слишком первостепенно для меня, я просто хочу попробовать и получить хорошие привычки с помощью Python Programming.

+0

Я бы сказал, что вся запись должна быть сохранена в базе данных с самого начала. – kennytm

ответ

6

Вот радикальный подход.

Нельзя.

У вас есть два файла CSV; один (пользователи) явно является водителем. Оставьте это в покое. Другое - коды транзакций для пользователя - можно превратить в простой словарь.

Не объединяйте или не присоединяйте ничего, кроме случаев, когда это абсолютно необходимо. Конечно, не «сливайтесь» или «предварительно присоединитесь».

Напишите свое приложение, просто выполните простые поиски в другой коллекции.

Создать список словарей и перебирать список сравнения ключей каждый раз,

Закрыть. Похоже на это. Примечание. Нет сортировки.

import csv 
with open('activations.csv','rb') as act_data: 
    rdr= csv.DictReader(act_data) 
    activations = dict((row['user'],row) for row in rdr) 
with open('users.csv','rb') as user_data: 
    rdr= csv.DictReader(user_data) 
    with open('users_2.csv','wb') as updated_data: 
     wtr= csv.DictWriter(updated_data, ['some','list','of','columns']) 
     for user in rdr: 
      user['some_field']= activations[user['user_id_column']]['some_field'] 
      wtr.writerow(user) 

Это быстро и просто. Сохраните словари (используйте shelve или pickle).

Однако в худшем случае это может привести к переходу на len (inputDict) * len (outputDict) < - Не знаете?

False.

Один список является «управляющим» списком. Другой - список поиска. Вы будете ездить по итерации через пользователей и искать соответствующие значения для транзакции. Это O (n) в списке пользователей. Поиск - O (1) потому что словари - хеши.

+0

Текущие словари, похоже, просто строки базы данных с именованными полями, и это не хорошая структура для поиска. Почему вы говорите, что текущие ключи являются «правильными»? – kriss

+0

@kriss: Я не верю, что это строки базы данных. Какие у вас есть доказательства? Ключи «правильные», потому что они являются ключами в словаре Python. –

+0

Я считаю, что используемый синтаксис '{user: myUser, ...}' должен быть '{'user': myUser, ...}'. Я так считаю из-за префикса 'my' перед переменными. Я понимаю это как использование словаря как именованного кортежа, но это не обязательно обычные строки базы данных, это просто аналогия. – kriss

1

Сортировка двух наборов данных по номеру транзакции. Таким образом, вам всегда нужно хранить только одну строку в памяти.

+0

-1: Сорты медленные.Словари - потому что они хэшированы - быстр. –

+0

Сортировка может стать очень быстрой, если вы больше не можете хранить словарь в ОЗУ. –

0

Я бы создал карту myTransactionNumber -> {transaction: myTransactionNumber, activationNumber: myActivationNumber}, а затем перечислил {user: myUser, transaction: myTransactionNumber} записей и на нужной карте. myTransactionNumber. Сложность поиска должна быть O(log N), где N - количество записей в наборе. Таким образом, сложная сложность будет O(M*log N), где M - количество пользовательских записей.

1

Это похоже на типичное использование словарей с номером транзакции в качестве ключа. Но вам не нужно создавать общую структуру, просто создавайте поисковые словари и используйте их по мере необходимости.

Смежные вопросы