R или Python для манипулирования файлами - PullRequest
3 голосов
/ 05 мая 2010

У меня есть 4 достаточно сложных скрипта r, которые используются для манипулирования файлами csv и xml. Они были созданы другим отделом, где они работают исключительно в р.

Насколько я понимаю, r работает очень быстро при работе с данными, но на самом деле он не оптимизирован для работы с файлами. Могу ли я ожидать значительного увеличения скорости за счет преобразования этих скриптов в python? Или это пустая трата времени?

Ответы [ 6 ]

10 голосов
/ 05 мая 2010

Я регулярно пишу на R и Python. Я считаю, что модули Python для записи, чтения и анализа информации проще в использовании, обслуживании и обновлении. Маленькие тонкости, такие как то, как python позволяет вам работать со списками элементов по индексированию R, значительно упрощают чтение.

Я очень сомневаюсь, что вы сможете значительно ускорить переключение языка. Если вы становитесь новым «сопровождающим» этих сценариев и считаете, что Python проще для понимания и расширения, то я бы сказал, пойти на это.

Компьютерное время дешево ... Время программиста дорого. Если у вас есть другие дела, я бы просто хромал вместе с тем, что у вас есть, пока у вас не будет свободного дня, чтобы пообщаться с ними.

Надеюсь, это поможет.

2 голосов
/ 09 мая 2010

Несколько недель назад я написал скрипт на Python для извлечения некоторых строк из большого (280 МБ) файла CSV . Точнее, я хотел извлечь всю доступную информацию о компаниях в dbpedia, которые имеют поле ISIN. Позже я попробовал то же самое в R, но, как ни старался, скрипт R потребовал в 10 раз больше, чем скрипт python (10 минут против 1 минуты на моем довольно старом ноутбуке). Возможно, это связано с моим знанием R, и в этом случае я буду признателен за подсказку о том, как сделать скрипт быстрее. Вот код питона

from time import clock

clock()
infile = "infobox_de.csv"
outfile = "companies.csv"

reader = open(infile, "rb")
writer = open(outfile, "w")

oldthing = ""
isCompany = False
hasISIN = False
matches = 0

for line in reader:
    row = line.strip().split("\t")
    if len(row)>0: thing = row[0]
    if len(row)>1: key = row[1]
    if len(row)>2: value = row[2]
    if (len(row)>0) and (oldthing != thing):
      if isCompany and hasISIN:
        matches += 1
        for tup in buf:
          writer.write(tup)
      buf = []
      isCompany = False
      hasISIN = False
    isCompany = isCompany or ((key.lower()=="wikipageusestemplate") and (value.lower()=="template:infobox_unternehmen"))
    hasISIN = hasISIN or ((key.lower()=="isin") and (value!=""))
    oldthing = thing
    buf.append(line)

writer.close()
print "finished after ", clock(), " seconds; ", matches, " matches."

и вот скрипт R (у меня больше нет эквивалентной версии, но очень похожий, который возвращает фрейм данных вместо записи файла csv и не проверяет ISIN):

infile <- "infobox_de.csv"
maxLines=65000

reader <- file(infile, "r")
writer <- textConnection("queryRes", open = "w", local = TRUE)
writeLines("thing\tkey\tvalue\tetc\n", writer)

oldthing <- ""
hasInfobox <- FALSE
lineNumber <- 0
matches <- 0
key <- ""
thing <- ""

repeat {
  lines <- readLines(reader, maxLines)
  if (length(lines)==0) break
  for (line in lines) {
    lineNumber <- lineNumber + 1
    row = unlist(strsplit(line, "\t"))
    if (length(row)>0) thing <- row[1]
    if (length(row)>1) key <- row[2]
    if (length(row)>2) value <- row[3]
    if ((length(row)>0) && (oldthing != thing)) {
      if (hasInfobox) {
        matches <- matches + 1
        writeLines(buf, writer)
      }
      buf <- c()
      hasInfobox <- FALSE
    }
    hasInfobox <- hasInfobox || ((tolower(key)=="wikipageusestemplate") && (tolower(value)==tolower("template:infobox_unternehmen")))
    oldthing <- thing
    buf <- c(buf, line)
  }
}
close(reader)
close(writer)
readRes <- textConnection(queryRes, "r")
result <- read.csv(readRes, sep="\t", stringsAsFactors=FALSE)
close(readRes)
result

Что я сделал явно, так это ограничил readLines максимумом до 65000 строк. Я сделал это, потому что думал, что моей машине с 500 МБ ОЗУ не хватит памяти. Я не пробовал без этого ограничения.

1 голос
/ 05 мая 2010

что вы подразумеваете под "манипулированием файлами"? Вы говорите о перемещении файлов, удалении, копировании и т. д., в этом случае я бы использовал оболочку, например, bash и т. д., если вы говорите о чтении данных, выполнении вычислений, возможно, выписывании нового файла и т. д., тогда, возможно, вы могли бы использовать Python или R., если обслуживание не является проблемой, я бы просто оставил его как R и нашел бы другую рыбу для жарки, поскольку вы не увидите достаточного ускорения, чтобы оправдать свое время и усилия в портировании этого кода.

1 голос
/ 05 мая 2010

Знать, где время проводится. Если ваши R-скрипты являются узким местом на диске ввода-вывода (и это очень возможно в этом случае), то вы можете переписать их в сборке, оптимизированной для рук, и не будете быстрее. Как всегда с оптимизацией, если вы не измеряете сначала, вы просто мочитесь на ветер. Если они не являются узкими местами при вводе-выводе диска, вы, вероятно, увидите больше преимуществ от улучшения алгоритма, чем от изменения языка.

0 голосов
/ 05 мая 2010

R манипулирование данными имеет правила для быстрого выполнения. Основы:

  1. векторизовать
  2. используйте data.frames как можно меньше (например, в конце)

Ищите оптимизацию и профилирование времени R, и вы найдете множество ресурсов, которые могут вам помочь.

0 голосов
/ 05 мая 2010

Я предполагаю, что вы, вероятно, не увидите значительного ускорения во времени. При сравнении языков высокого уровня накладные расходы в языке обычно не являются причиной проблем с производительностью. Как правило, проблема заключается в вашем алгоритме.

Я не очень знаком с R, но вы можете найти ускорение, читая большие куски данных в память сразу по сравнению с меньшими кусками (меньше системных вызовов). Если у R нет возможности изменить что-то подобное, вы, вероятно, обнаружите, что python может быть намного быстрее просто благодаря этой способности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...