LINUX.ORG.RU

История изменений

Исправление lbvf50txt, (текущая версия) :

Думаю если переписать без итерации по строкам (мап строку по ньюлайнам же бьёт?), то скорость вообще сравняется.

И у многих даже нет «ощущения» того, как быстро могут работать компьютеры. Они не знают когда их программа на питоне всего в полтора раза медленнее, чем могла бы быть на условном си, а когда раз в 50.

Дак перепишите. Возьмите мной представленную задачу и напишите на алгоритмически чистом Си с правильными подходами, с оценкой алгоритма, еще сделайте inplace, чтоб лишняя память не расходовалась. Опубликуйте код.

Сколько у вас времени уйдет? То-то и оно. Все эти разговоры о медленном Python и быстром С это больше форумнуе творчество «когда не горит».

Вот вам код на Ruby, если задумаете переписывать:

#!/usr/bin/env ruby

urls = []
urls.push("http://az.lib.ru/t/tolstoj_lew_nikolaewich/text_0040.shtml")
urls.push("http://az.lib.ru/t/tolstoj_lew_nikolaewich/text_0050.shtml")
urls.push("http://az.lib.ru/t/tolstoj_lew_nikolaewich/text_0060.shtml")
urls.push("http://az.lib.ru/t/tolstoj_lew_nikolaewich/text_0070.shtml")

def run
 $start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
end

def stop(name)
  finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  elapsed_ms = ((finish - $start) * 1000).round(3)
  STDERR.puts "#{name} #{elapsed_ms} ms"
end

def line_to_70(line)
  l = line.split(" ")
  arr = []
  max = 70
  i = 0
  while i < l.size 
    if arr.empty?
      arr.push ""
    end
    if (arr[-1].size + l[i].size) < max
      arr[-1] += l[i] + " "
    else
      arr.push ""
      arr[-1] += l[i] + " "
    end
    i += 1
  end
  arr.reject{|x| x.empty?}
end

require 'open-uri'
run
contents = urls.map{|url| URI.open(url, &:read)}
stop("Download")

run
contents.map!{|v| v.encode("UTF-8")}
stop("Convert to UTF-8")

run
contents.map!{|v| v.gsub("\r", "")}
stop("Remove \\r")

run 
texts = contents.map{|html| 
  html
    .gsub(/<!--.*?-->/m, '')
    .gsub(/ /, ' ')
    .gsub(/<\/?[^>]+>/, '') 
}
stop("Strip HTML")

run
texts.map!{|v| v.gsub(/(\s)-{2}(\s)/, '\1-\2')}
stop("Remove `-`")

run
texts.map!{|text| 
  text
    .split("\n")
    .map{|l| l.empty? ? "" : line_to_70(l).join("\n")}
    .join("\n\n").gsub(/\n{4,}/,"\n\n") 
}
stop("Make 70 symbols")

run
texts.each{|v|
    print v
}
stop("To STDOUT")


# Download 2121.023 ms
# Convert to UTF-8 103.808 ms
# Remove \r 60.152 ms
# Strip HTML 331.474 ms
# Remove `-` 102.34 ms
# Make 70 symbols 920.447 ms
# To STDOUT 6.182 ms

Исправление lbvf50txt, :

Думаю если переписать без итерации по строкам (мап строку по ньюлайнам же бьёт?), то скорость вообще сравняется.

И у многих даже нет «ощущения» того, как быстро могут работать компьютеры. Они не знают когда их программа на питоне всего в полтора раза медленнее, чем могла бы быть на условном си, а когда раз в 50.

Дак перепишите. Возьмите мной представленную задачу и напишите на алгоритмически чистом Си с правильными подходами, с оценкой алгоритма, еще сделайте inplace, чтоб лишняя память не расходовалась. Опубликуйте код.

Сколько у вас времени уйдет? То-то и оно. Все эти разговоры о медленном Python и быстром С это больше форумнуое творчество «когда не горит».

Вот вам код на Ruby, если задумаете переписывать:

#!/usr/bin/env ruby

urls = []
urls.push("http://az.lib.ru/t/tolstoj_lew_nikolaewich/text_0040.shtml")
urls.push("http://az.lib.ru/t/tolstoj_lew_nikolaewich/text_0050.shtml")
urls.push("http://az.lib.ru/t/tolstoj_lew_nikolaewich/text_0060.shtml")
urls.push("http://az.lib.ru/t/tolstoj_lew_nikolaewich/text_0070.shtml")

def run
 $start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
end

def stop(name)
  finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  elapsed_ms = ((finish - $start) * 1000).round(3)
  STDERR.puts "#{name} #{elapsed_ms} ms"
end

def line_to_70(line)
  l = line.split(" ")
  arr = []
  max = 70
  i = 0
  while i < l.size 
    if arr.empty?
      arr.push ""
    end
    if (arr[-1].size + l[i].size) < max
      arr[-1] += l[i] + " "
    else
      arr.push ""
      arr[-1] += l[i] + " "
    end
    i += 1
  end
  arr.reject{|x| x.empty?}
end

require 'open-uri'
run
contents = urls.map{|url| URI.open(url, &:read)}
stop("Download")

run
contents.map!{|v| v.encode("UTF-8")}
stop("Convert to UTF-8")

run
contents.map!{|v| v.gsub("\r", "")}
stop("Remove \\r")

run 
texts = contents.map{|html| 
  html
    .gsub(/<!--.*?-->/m, '')
    .gsub(/ /, ' ')
    .gsub(/<\/?[^>]+>/, '') 
}
stop("Strip HTML")

run
texts.map!{|v| v.gsub(/(\s)-{2}(\s)/, '\1-\2')}
stop("Remove `-`")

run
texts.map!{|text| 
  text
    .split("\n")
    .map{|l| l.empty? ? "" : line_to_70(l).join("\n")}
    .join("\n\n").gsub(/\n{4,}/,"\n\n") 
}
stop("Make 70 symbols")

run
texts.each{|v|
    print v
}
stop("To STDOUT")


# Download 2121.023 ms
# Convert to UTF-8 103.808 ms
# Remove \r 60.152 ms
# Strip HTML 331.474 ms
# Remove `-` 102.34 ms
# Make 70 symbols 920.447 ms
# To STDOUT 6.182 ms

Исходная версия lbvf50txt, :

Думаю если переписать без итерации по строкам (мап строку по ньюлайнам же бьёт?), то скорость вообще сравняется.

Дак перепишите. Возьмите мной представленную задачу и напишите на алгоритмически чистом Си с правильными подходами, с оценкой алгоритма, еще сделайте inplace, чтоб лишняя память не расходовалась. Опубликуйте код.

Сколько у вас времени уйдет? То-то и оно. Все эти разговоры о медленном Python и быстром С это больше форумнуое творчество «когда не горит».

Вот вам код на Ruby, если задумаете переписывать:

#!/usr/bin/env ruby

urls = []
urls.push("http://az.lib.ru/t/tolstoj_lew_nikolaewich/text_0040.shtml")
urls.push("http://az.lib.ru/t/tolstoj_lew_nikolaewich/text_0050.shtml")
urls.push("http://az.lib.ru/t/tolstoj_lew_nikolaewich/text_0060.shtml")
urls.push("http://az.lib.ru/t/tolstoj_lew_nikolaewich/text_0070.shtml")

def run
 $start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
end

def stop(name)
  finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  elapsed_ms = ((finish - $start) * 1000).round(3)
  STDERR.puts "#{name} #{elapsed_ms} ms"
end

def line_to_70(line)
  l = line.split(" ")
  arr = []
  max = 70
  i = 0
  while i < l.size 
    if arr.empty?
      arr.push ""
    end
    if (arr[-1].size + l[i].size) < max
      arr[-1] += l[i] + " "
    else
      arr.push ""
      arr[-1] += l[i] + " "
    end
    i += 1
  end
  arr.reject{|x| x.empty?}
end

require 'open-uri'
run
contents = urls.map{|url| URI.open(url, &:read)}
stop("Download")

run
contents.map!{|v| v.encode("UTF-8")}
stop("Convert to UTF-8")

run
contents.map!{|v| v.gsub("\r", "")}
stop("Remove \\r")

run 
texts = contents.map{|html| 
  html
    .gsub(/<!--.*?-->/m, '')
    .gsub(/&nbsp;/, ' ')
    .gsub(/<\/?[^>]+>/, '') 
}
stop("Strip HTML")

run
texts.map!{|v| v.gsub(/(\s)-{2}(\s)/, '\1-\2')}
stop("Remove `-`")

run
texts.map!{|text| 
  text
    .split("\n")
    .map{|l| l.empty? ? "" : line_to_70(l).join("\n")}
    .join("\n\n").gsub(/\n{4,}/,"\n\n") 
}
stop("Make 70 symbols")

run
texts.each{|v|
    print v
}
stop("To STDOUT")


# Download 2121.023 ms
# Convert to UTF-8 103.808 ms
# Remove \r 60.152 ms
# Strip HTML 331.474 ms
# Remove `-` 102.34 ms
# Make 70 symbols 920.447 ms
# To STDOUT 6.182 ms