[forum.local]Скрипт накрутки рейтинга (python)

ret123

скрипт на питоне + конфигурационный файл, который располагается в каталоге ~/.config
конфиг выполнен в xml, формат его понятен, поэтому не буду останавливаться подробно. Должны быть определены два списка: ботов с их куками и список юзеров с назначенной им оценкой.
Принцип действия: скрипт читает конфигурационный файл, берёт юзера, получает список последних его 50 постов. Потом от имени каждого юзера выставляет оценку за те посты, которые ещё не были оценены (или все, если дата последнего поста неизвестна). Затем фиксирует дату последнего поста. Так повторяет для оставшихся юзеров. Затем сохраняет в конфигурационном файле время и дату последнего поста.
нормальное выражение для hash-функции эквивалентной форумной (http://forum.b.gz.ru//js/generic.js - страшное название типа _x....) построил , скрипт написал я.

tipnote

А можно к коду придраться? :)

ret123

правда, баловаться не стоит, а тем более не стоит вгонять его в кронтаб - забанят ;)

ret123

можно

ret123

да, cookies для pyshop уже не действительны, поэтому нужно будет поставить какие-нибудь другие.

slonishka

жжошь, джонни! ай лав ю!

pitrik2

кто поставил минус?
сприпт не смотрел но автор молодец, явно видно что потрудился на славу

laki

хоть этот мудак меня и игнорит.
но четыре его бота, которые заминусовали меня, включая основного юзера джобишопа отправились в забан.
так что господа одним мудаком стало меньше.
шаллер обещал разобраться с обнулением накрутки.
ПС. если это считается верхом программерской мысли то авторы себе льстят :smirk:

kokoc88

кто поставил минус?
Ошибка в программе накрутки? :grin:

tipnote

Табы - зло :)
cases - через словарь лямбд, имхо
магические списки значений вынести на уровень свойств и сделать кортежами, а соответствующие if-else в однострочники (мб и функции там уже не потребуются отдельные)
еще много где if-else в однострочники и отказаться от функций
start_a: нах там ретёрн?
сложения строк - в форматные строки
с остальным пока лень думать, как перефигачить :)

SCIF32

гораздо проще сразу попросить о забане.

slonishka

просто только кошки ебутся. настоящие мерзавцы пишут для этого скрипты. ;)

SCIF32

так напишите скрипт, который отправляет приват админам с просьбой о забане :grin:

moskva-04

 
cases - через словарь лямбд, имхо

С таким подходом не сталкивался. Можно подробнее?
 
магические списки значений вынести на уровень свойств и сделать кортежами, а соответствующие if-else в однострочники (мб и функции там уже не потребуются отдельные)

подозреваю, что это замечание относится к парсеру HTML. Нет, там будут именно функции, и именно в таком количестве.
 
сложения строк - в форматные строки

я противник формата. То, что в бедоне формат работает быстрее сложения строк, исключительно его проблемы.

tipnote

Почитай, как в питоне реализуют switch или уходят от if-elif-...-elif-else. Словарь лямбд - это достаточно специфично, но пишется и читается проще, а при частом использовании может дать прирост производительности. Все имхо.
Пох на функции - избавь читателя от непонятных константных списков. И не заставляй читать четыре строчки вместо одной, там, где это возможно по соображениям удобства.
Ох, мля, как все запущено. Ты сам не видишь своих трехэтажных выражений, где складываются строки, заодно подсчитываются разные параметры и проч? Не нравится формат - подумай о разделении логики и представления. И насколько я помню, формат частенько работает медленней - так что ты не в кассу.

moskva-04

нет, для скорости как-раз рекомендуют формат.
Непонятные константные списки - это списки состояний. Что делать, если в этом недоязыке нет атомов? Вводить переменные как-то не слишком охота.

moskva-04

в моём случае словари с лямбдами достаточно сомнительный подход - для лямбды нужна переменная, которая не будет использоваться. Короче, не стоит оно того.

tipnote

нет, для скорости как-раз рекомендуют формат.
Может не для скорости, а для экономии памяти?
Мой личный опыт иногда показывал именно отставание по скорости формата от сложения. Видимо, в силу разбора строки.
Непонятные константные списки - это списки состояний. Что делать, если в этом недоязыке нет атомов? Вводить переменные как-то не слишком охота.
Ну, батенька, с таким подходом вы далеко не уедете (или вам не нужно?). Типа лучше я буду писать как хочу, принимать правила хорошего тона языка не собираюсь, поэтому что они голимые! Ну так пишите на своем мегаязыке, зачем плодить дурной код на питоне? Его и так хватает, уж можете мне поверить!

tipnote

Зачем лямбде переменная, которая не будет использоваться? В лямбы идут a,b,c. В словарь - cas.

caseFunc = {
0: lambda a,b,c: (a&b)|(~a&c
1: lambda a,b,c: a^b^c,
2: lambda a,b,c: (a&b)|(a&c)|(b&c
3: lambda a,b,c: a^b^c
}

caseFunc[cas](a,b,c)

moskva-04

три переменные - слишком много. Создание словаря, а потом его использование - это очень плохо.

kill-still

что такое атом? константа?

tipnote

Создание словаря, а потом его использование - это очень плохо.
Пояснение в студию. Если чО, словарь в питоне крайне эффективно реализован и используется практически _везде_.

bleyman

Может, он тупой (или был тупой во время появления у тебя личного опыта) и не умеет/не умел превращать набор сложений в аппенды к мутабл строке?

kill-still

Приверженность определенного человека какой-то одной парадигме иногда носит настолько сильный характер, что споры о преимуществах и недостатках различных парадигм относятся в околокомпьютерных кругах к разряду так называемых «религиозных» (или «священных») войн. (с)
:umnik:

tipnote

Кто тупой - питон? Хз, как он делал это внутри, но в питоне строки иммьютбл.

moskva-04

что такое атом? константа?

что-то вроде enum в це/цепепе. Или, даже вернее, что-то вроде сущности получаемой через #define entity. Только она видна языку.

moskva-04

По-моему, этот не Ъ. Создание case-списка, а потом его использование.

tipnote

А, ну так прямо бы и говорил, что _не_нравится_ :) Это как раз понять можно.

kill-still

Только она видна языку.
А нафига?

Werdna

Получи плюсик.
Была бы моя формула — смысла бы в накрутке не было. :)

moskva-04

удобно для описания состояний. Я бы тогда вместо списков чисел употребил феньки вроде:
[ WAITING_TR, WAITING_FIRST_BLABLA, WAITING_NAME_IN_CHEGO_TO_TAM ...]

kill-still

а чО, в питоне так неззя? о.О

moskva-04

 $ ipython 
Python 2.5.2 (r252:60911, Feb 26 2008, 14:43:53)
Type "copyright", "credits" or "license" for more information.

IPython 0.8.1 -- An enhanced Interactive Python.
? -> Introduction to IPython's features.
%magic -> Information about IPython's 'magic' % functions.
help -> Python's own help system.
object? -> Details about 'object'. ?object also works, ? prints more.

In [1]: list_=[WAIT,RUN,SLEEP]
---------------------------------------------------------------------------
<type 'exceptions.NameError'> Traceback (most recent call last)

/home/master/<ipython console> in <module>

<type 'exceptions.NameError'>: name 'WAIT' is not defined

hwh2010

caseFunc = {
0: lambda a,b,c: (a&b)|(~a&c
1: lambda a,b,c: a^b^c,
2: lambda a,b,c: (a&b)|(a&c)|(b&c
3: lambda a,b,c: a^b^c
}
caseFunc[cas](a,b,c)
Эта функция вообще слизывалась с
Самой главной целью было нигде не ошибиться, чтобы не пострадала хеш-функция.

tipnote

Какая-то подмена понятий. Это обычные либо константы либо макросы у тебя так? Ну так и опиши их, ты же все равно их описывал бы на сях, нет?
А то ты чего-то непонятное требуешь от интерпретатора - знать никем нигде не объявленные объекты.

moskva-04

В эрланге они есть, должны начинаться, правда, с прописной буквы. Очень удобно. В C/C++ можно примерно так же использовать enum, а в питоне такого нет - неудобно. Можно, конечно, либо стринги делать, либо переменные - но это много лишних букв.

psm-home

Это обычные либо константы либо макросы у тебя так?
Это имена, насколько я понимаю.

Dmitriy82

Не ожидал, что это проявится для четырёх альтернатив, но "словарь лямбд" и вправду чуть быстрее кейза. Однако psycho с ним борется существенно хуже.
#import psyco
#psyco.full
#print "with psycho:"

from time import time

def measureTime(f):
start=time
f
print f.__name__,"\t",time-start

n=10000000

@measureTime
def :
def p(n,a,b,c):
if n==0:
return (a&b)|(~a&b)
elif n==1:
return a^b^c
elif n==2:
return (a&b)|(a&c)|(b&c)
elif n==3:
return a^b^c

for i in range(n):
x=p(i&3,i,i,i)



@measureTime
def :
p={
0: lambda a,b,c: (a&b)|(~a&c
1: lambda a,b,c: a^b^c,
2: lambda a,b,c: (a&b)|(a&c)|(b&c
3: lambda a,b,c: a^b^c
}
for i in range(n):
x=p[i&3](i,i,i)

        12.0310001373
9.92199993134

with psycho:
0.28200006485
0.96799993515

tipnote

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

bleyman

Кто тупой - питон? Хз, как он делал это внутри, но в питоне строки иммьютбл.
Эм. В питоне-то строки имьютбл, но написан он на С =)
Я чо в виду имею: вот например в шарпе есть имьютабл string и мьютабл StringBuilder. Умный компилятор нифига не доверяет рантайму и превращает выражение вида
return " (" + i + ") ";
в создание стрингбилдера и вызовы Append/AppendFormat, для конкатенации более чем двух строк, если мне не изменяет память. В результате если ты конкатенируешь n строк у тебя вовсе не создаётся n - 1 промежуточных результатов, что крайне благотворно, живородяще даже, сказывается на производительности.
Откуда возникает резонный вопрос: умеет ли питон разрюхивать подобные штуки? Он, конечно, динамически типизован, это дико мешает, но, может быть, он всё равно умеет?
Если нет, то, естественно, % будет работать быстрее. Потому что парсинг строки формата не очень сложный, зато интерпретатор, написанный на С, может избежать туевой хучи созданий временных строк, копирований строк етс. Прям в один буфер всё пихается, прикольно.

tipnote

Хз, вряд ли. В це питон вообще оптимизациями не сильно голову забивают, имхо (
А про скорость - весь вопрос в том, что и как складывают и какова сложность форматной строки. Не вижу причин, чтобы где-то не работал быстрее формат, а где-то сложение. Хз. Мне сейчас влом искать свои тесты по этой тематике...

tipnote

Кстати, используй модуль timeit - удобнее.

bleyman

Кстати, совет по алгоритму: выставлять оценки за последние пятьдесят постов палевно.
Мазёвей из архива вытаскивать, чтобы никто не догадался.

moskva-04

Нет, так нельзя. Через какое-то время оценки выставляться перестают.
Оставить комментарий
Имя или ник:
Комментарий: