python - 我如何为给定的概率分布生成直方图(用于功能测试服务器)?

标签 python statistics simulation stress-testing

我正在尝试使用真实的请求频率分布来自动执行服务器的功能测试。 (某种负载测试,某种模拟)

我选择了 Weibull分布,因为它“有点”符合我观察到的分布(快速上升,快速下降但不是立即)

我使用此分布来生成在给定的开始日期和结束日期之间每天应发送的请求数

我在 Python 中拼凑了一个算法,它有点管用,但感觉很笨拙:

how_many_days = (end_date - start_date).days
freqs = defaultdict(int)
for x in xrange(how_many_responses):
    freqs[int(how_many_days * weibullvariate(0.5, 2))] += 1
timeline = []
day = start_date
for i,freq in sorted(freqs.iteritems()):
    timeline.append((day, freq))
    day += timedelta(days=1)
return timeline

有什么更好的方法可以做到这一点?

最佳答案

这很快而且可能不太准确,但如果您自己计算 PDF,那么至少可以更轻松地在单个时间轴上放置多个较小/较大的文件。 dev 是控制粗糙度的高斯噪声中的标准偏差。请注意,这不是生成所需内容的“正确”方法,但它很简单。

import math
from datetime import datetime, timedelta, date
from random import gauss

how_many_responses = 1000
start_date = date(2008, 5, 1)
end_date = date(2008, 6, 1)
num_days = (end_date - start_date).days + 1
timeline = [start_date + timedelta(i) for i in xrange(num_days)]

def weibull(x, k, l):
    return (k / l) * (x / l)**(k-1) * math.e**(-(x/l)**k)

dev = 0.1
samples = [i * 1.25/(num_days-1) for i in range(num_days)]
probs = [weibull(i, 2, 0.5) for i in samples]
noise = [gauss(0, dev) for i in samples]
simdata = [max(0., e + n) for (e, n) in zip(probs, noise)]
events = [int(p * (how_many_responses / sum(probs))) for p in simdata]

histogram = zip(timeline, events)

print '\n'.join((d.strftime('%Y-%m-%d ') + "*" * c) for d,c in histogram)

关于python - 我如何为给定的概率分布生成直方图(用于功能测试服务器)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53786/

相关文章:

python - 修剪字典

python - 如何将实例变量传递给类定义内的装饰器?

language-agnostic - 模拟 10,000 个滑槽和梯子游戏的最易读的编程语言?

python - 计算数据框中多个组的 z 分数

python - 针对原假设测试 80,000 多个模拟正态分布观察集

tdd - 在Verilog或VHDL中进行逻辑(芯片)设计的测试驱动开发(TDD)的经验

javascript - 如何用 Javascript 模拟慢速连接?

python - python中的单词n-gram句子列表

python - 从一个十六进制字符串构造一个 Numpy 数组

ios - 我可以在 IOS 应用程序中为 WebView /浏览器实现谷歌分析吗?