История изменений
Исправление 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(/ /, ' ')
.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