Мне пришлось опубликовать это по аналогичному вопросу, пока мой рейтинг репутации не подскочил (спасибо тому, кто наткнулся на меня!).
Все эти решения игнорируют один из способов сделать этот запуск значительно быстрее, а именно, используя небуферизованный (необработанный) интерфейс, используя bytearrays и делая собственную буферизацию. (Это применимо только к Python 3. В Python 2 необработанный интерфейс может использоваться или не использоваться по умолчанию, но в Python 3 вы по умолчанию в Unicode.)
Использование модифицированной версии Я считаю, что следующий код быстрее (и немного больше pythonic), чем любое из предлагаемых решений:
def rawcount(filename):
f = open(filename, 'rb')
lines = 0
buf_size = 1024 * 1024
read_f = f.raw.read
buf = read_f(buf_size)
while buf:
lines += buf.count(b'\n')
buf = read_f(buf_size)
return lines
Используя отдельную функцию генератора, это быстрее запускает smidge:
def _make_gen(reader):
b = reader(1024 * 1024)
while b:
yield b
b = reader(1024*1024)
def rawgencount(filename):
f = open(filename, 'rb')
f_gen = _make_gen(f.raw.read)
return sum( buf.count(b'\n') for buf in f_gen )
Это можно сделать полностью с выражениями генераторов in-line, использующими itertools, но это выглядит довольно странно:
from itertools import (takewhile,repeat)
def rawincount(filename):
f = open(filename, 'rb')
bufgen = takewhile(lambda x: x, (f.raw.read(1024*1024) for _ in repeat(None)))
return sum( buf.count(b'\n') for buf in bufgen )
Вот мои тайминги:
function average, s min, s ratio
rawincount 0.0043 0.0041 1.00
rawgencount 0.0044 0.0042 1.01
rawcount 0.0048 0.0045 1.09
bufcount 0.008 0.0068 1.64
wccount 0.01 0.0097 2.35
itercount 0.014 0.014 3.41
opcount 0.02 0.02 4.83
kylecount 0.021 0.021 5.05
simplecount 0.022 0.022 5.25
mapcount 0.037 0.031 7.46
Попробуйте это:
Функция getValues () возвращает двумерный массив Objec [] []
function createEmployeeSheets() {
var ss = SpreadsheetApp.getActive();
var shLista = ss.getSheetByName('Lista');
var rgEData = shLista.getRange(1,3);
var eData=rgEData.getValue();//the number of names I think
var employeeDataRange = ssLista.getRange(2,1,eData,1);//Sheet names in column1 starting from row2
var employeeObjects = employeeDataRange.getValues();//sheet names in column 0
var template=ss.getSheetByName('Generador');//template
for (var i=0;i< employeeObjects.length; i++) {
if(!ss.getSheetByName(employeeObjects[i][0])){
template.getRange("K3").setValue(employeeObjects[i][0]);
var sheet=ss.insertSheet(employeeObjects[i][0], {template:template});
}
}
}
Этот код не был проверен.