Python A/B测试算法
我需要为我的用户开发A/B测试方法。基本上,我需要将我的用户分成若干组,例如40%和60%。Python A/B测试算法,python,mysql,python-2.7,Python,Mysql,Python 2.7,我需要为我的用户开发A/B测试方法。基本上,我需要将我的用户分成若干组,例如40%和60%。 我有大约10万用户,我需要知道什么是我最好的方法。随机数不是一个选项,因为用户每次都会得到不同的结果。我的第二个选择是修改我的数据库,以便每个用户都有一个预定义的数字(随机生成)。消极的一面是,如果我得到50,例如,我将始终拥有该数字,除非我创建一个新用户。我不介意,但我不确定更改数据库是否是一个好主意 还有其他解决方案可以避免吗?针对主键运行一个简单的算法。例如,如果用户id有一个整数,则用偶数和奇数
我有大约10万用户,我需要知道什么是我最好的方法。随机数不是一个选项,因为用户每次都会得到不同的结果。我的第二个选择是修改我的数据库,以便每个用户都有一个预定义的数字(随机生成)。消极的一面是,如果我得到50,例如,我将始终拥有该数字,除非我创建一个新用户。我不介意,但我不确定更改数据库是否是一个好主意
还有其他解决方案可以避免吗?针对主键运行一个简单的算法。例如,如果用户id有一个整数,则用偶数和奇数分隔
如果需要两个以上的组,请使用mod函数。对主键运行一个简单的算法。例如,如果用户id有一个整数,则用偶数和奇数分隔
如果您需要两个以上的组,请使用mod函数。您使用的是MySQL,因此很难判断这是否是一个好主意。修改数据库可能代价高昂。而且,如果它开始变大,从长远来看可能会影响性能。此外,您还必须修改您的系统,以便在数据库中为每个新用户包含该号码。您已将其标记为python问题。因此,这里是另一种不用对数据库进行任何更改的方法。因为您谈论的是用户,所以您可能对所有用户都有一个唯一的标识符,比如说电子邮件。我将使用uuid代替电子邮件
import hashlib
def calculateab(email):
maxhash = 16**40
emailhash = int(hashlib.sha1(email).hexdigest(), 16)
div = (maxhash/100)-1
return int(float(emailhash/div))
#A small demo
if __name__ == '__main__':
import uuid, time, json
emails = []
verify = {}
for i in range(1000000):
emails.append(str(uuid.uuid4()))
starttime = time.time()
for i in emails:
ab = calculateab(i)
if ab not in verify:
verify[ab] = 1
else:
verify[ab] += 1
#json for your eye's pleasure
print json.dumps(verify, indent = 4)
#if you look at the numbers, you'll see that they are well distributed so
#unless you are going to do that every second for all users, it should work fine
print "total calculation time {0} seconds".format((time.time() - starttime))
与python无关,更多的是一个数学解决方案。您可以使用md5、sha1或任何类似的代码,只要它具有固定的长度,并且是十六进制数。第6行的
-1
是可选的-它将范围设置为0到99,而不是1到100。您还可以修改它以使用浮动,这将给您带来更大的灵活性。您使用的是MySQL,所以很难说这是不是一个好主意。修改数据库可能代价高昂。而且,如果它开始变大,从长远来看可能会影响性能。此外,您还必须修改您的系统,以便在数据库中为每个新用户包含该号码。您已将其标记为python问题。因此,这里是另一种不用对数据库进行任何更改的方法。因为您谈论的是用户,所以您可能对所有用户都有一个唯一的标识符,比如说电子邮件。我将使用uuid代替电子邮件
import hashlib
def calculateab(email):
maxhash = 16**40
emailhash = int(hashlib.sha1(email).hexdigest(), 16)
div = (maxhash/100)-1
return int(float(emailhash/div))
#A small demo
if __name__ == '__main__':
import uuid, time, json
emails = []
verify = {}
for i in range(1000000):
emails.append(str(uuid.uuid4()))
starttime = time.time()
for i in emails:
ab = calculateab(i)
if ab not in verify:
verify[ab] = 1
else:
verify[ab] += 1
#json for your eye's pleasure
print json.dumps(verify, indent = 4)
#if you look at the numbers, you'll see that they are well distributed so
#unless you are going to do that every second for all users, it should work fine
print "total calculation time {0} seconds".format((time.time() - starttime))
与python无关,更多的是一个数学解决方案。您可以使用md5、sha1或任何类似的代码,只要它具有固定的长度,并且是十六进制数。第6行的
-1
是可选的-它将范围设置为0到99,而不是1到100。您还可以修改它以使用浮动,这将给您带来更大的灵活性。我将添加一个只包含userId和a/B的辅助表。您不需要更改现有的表,如果需要,可以很容易地更改每个类的百分比。它的侵入性很小。我会添加一个只包含userId和A/B的辅助表。您不需要更改现有表,如果需要,可以很容易地更改每个类的百分比。它的侵入性非常小。您可以使用there用户id设置不同存储桶中的用户吗?1000,00是什么类型的数字?您可以使用there用户id设置不同存储桶中的用户吗?1000,00是什么类型的数字?这太完美了。正是我需要的。无需在用户登录时一次完成所有操作。我还远远没有一次拥有100万的在线用户。不管是哪种方式,在一个8gb内存的quad i7上只需3秒钟就可以完成。谢谢一件真正的艺术品,亚历山大!我根据您的工作制作了一个带有单元测试的小框架,并将您的名字添加到学分中:谢谢!太好了。正是我需要的。无需在用户登录时一次完成所有操作。我还远远没有一次拥有100万的在线用户。不管是哪种方式,在一个8gb内存的quad i7上只需3秒钟就可以完成。谢谢一件真正的艺术品,亚历山大!我根据您的工作制作了一个带有单元测试的小框架,并将您的名字添加到学分中:谢谢!