1. Python / Говнокод #7557

    −83

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    def get(a='',x=-1):
        b,c,d,e,f=a.split('\n'),[],[],0,0
        for i in range(len(b)):
            if i==0: c+=[i]; e+=len(b[i])+1; f+=len(b[i]); d+=[f]
            elif i==len(b)-1: f+=len(b[i]); d+=[f]; c+=[e]
            else: f+=len(b[i])+1; c+=[e]; d+=[f]; e+=len(b[i])+1
        for i in range(len(c)):
            if range(c[i], d[i]+1).count(x): return i

    Это код чувака, который хочет получить индекс строки по индексу символа.
    >>> get('a\nb', 0) # 0 - позиция символа "а"
    0
    >>> get('a\nb', 1) # 1 - позиция символа "\n"
    0
    >>> get('a\nb', 2) # 2 - позиция символа "b" (уже вторая строка)
    1

    Простой эквивалент кода:
    GetNewlineCount = lambda s, p: s.count('\n', 0, p)

    Запостил: Niceblack, 16 Августа 2011

    Комментарии (9) RSS

    • По timeit пробовали сравнивать?
      Ответить
      • >>> get = lambda s, p: s.count('\n', 0, p)
        >>> def get1(a='',x=-1):
        	    b,c,d,e,f=a.split('\n'),[],[],0,0
        	    for i in range(len(b)):
        		if i==0: c+=[i]; e+=len(b[i])+1; f+=len(b[i]); d+=[f]
        		elif i==len(b)-1: f+=len(b[i]); d+=[f]; c+=[e]
        		else: f+=len(b[i])+1; c+=[e]; d+=[f]; e+=len(b[i])+1
        	    for i in range(len(c)):
        		if range(c[i], d[i]+1).count(x): return i
        
        >>> from timeit import timeit
        >>> timeit('get("a\\nb",1)',setup='from __main__ import get')
        6.789099662338849
        >>> timeit('get("a\\nb",1)',setup='from __main__ import get1 as get')
        0.8742503148168339
        >>>
        Ответить
        • Наоборот.

          А если взять get('a'+'\nb'*10,20), то разница будет ещё разительнее.
          Ответить
        • И на глаз ясно, что длинный вариант будет занимать больше памяти и работать медленнее. У вас возможно была загружена система при первом тесте.
          Вот тест на нетбуке:
          get("a\\nbcdefghi\\n\\nkkkk\\ns,,,s,,,s\ \ntrollollo\\n12334566",20) # 3.4331777255
          get1("a\\nbcdefghi\\n\\nkkkk\\ns,,,s,,,s \\ntrollollo\\n12334566",20) # 85.8690221341
          Ответить
          • вы точно провели тест с незагруженной системой?
            Ответить
          • кстати да.
            >>> timeit('get("a\\nb",1)',setup='from __main__ import get')
            0.6096830368041992
            >>> timeit('get("a\\nb",1)',setup='from __main__ import get1 as get')
            5.789045095443726

            лямбда то быстрее.
            Ответить
            • В Питоне всегда — чем меньше Питона, тем быстрее.
              Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий