make fio scripts python3-ready
[fio.git] / tools / fiologparser.py
index 00e4d30f2a8955761c6de7c2090ce92cde710308..cc29f1c7bcbf5dea4bc73a0ce8ab7cb95a00c6ae 100755 (executable)
@@ -1,4 +1,5 @@
-#!/usr/bin/python
+#!/usr/bin/python2.7
+# Note: this script is python2 and python 3 compatible.
 #
 # fiologparser.py
 #
 #
 # to see per-interval average completion latency.
 
+from __future__ import absolute_import
+from __future__ import print_function
 import argparse
-import numpy
-import scipy
+import math
 
 def parse_args():
     parser = argparse.ArgumentParser()
@@ -46,7 +48,7 @@ def print_full(ctx, series):
     while (start < ftime):
         end = ftime if ftime < end else end
         results = [ts.get_value(start, end) for ts in series]
-        print "%s, %s" % (end, ', '.join(["%0.3f" % i for i in results]))
+        print("%s, %s" % (end, ', '.join(["%0.3f" % i for i in results])))
         start += ctx.interval
         end += ctx.interval
 
@@ -58,7 +60,7 @@ def print_sums(ctx, series):
     while (start < ftime):
         end = ftime if ftime < end else end
         results = [ts.get_value(start, end) for ts in series]
-        print "%s, %0.3f" % (end, sum(results))
+        print("%s, %0.3f" % (end, sum(results)))
         start += ctx.interval
         end += ctx.interval
 
@@ -70,7 +72,7 @@ def print_averages(ctx, series):
     while (start < ftime):
         end = ftime if ftime < end else end
         results = [ts.get_value(start, end) for ts in series]
-        print "%s, %0.3f" % (end, float(sum(results))/len(results))
+        print("%s, %0.3f" % (end, float(sum(results))/len(results)))
         start += ctx.interval
         end += ctx.interval
 
@@ -82,7 +84,6 @@ def print_averages(ctx, series):
 # to debug this routine, use
 #   # sort -n -t ',' -k 2 small.log
 # on your input.
-# Sometimes scipy interpolates between two values to get a percentile
 
 def my_extend( vlist, val ):
     vlist.extend(val)
@@ -102,21 +103,16 @@ def print_all_stats(ctx, series):
         for sample_array in sample_arrays:
             samplevalue_arrays.append( 
                 [ sample.value for sample in sample_array ] )
-        #print('samplevalue_arrays len: %d' % len(samplevalue_arrays))
-        #print('samplevalue_arrays elements len: ' + \
-               #str(map( lambda l: len(l), samplevalue_arrays)))
         # collapse list of lists of sample values into list of sample values
         samplevalues = reduce( array_collapser, samplevalue_arrays, [] )
-        #print('samplevalues: ' + str(sorted(samplevalues)))
         # compute all stats and print them
-        myarray = scipy.fromiter(samplevalues, float)
-        mymin = scipy.amin(myarray)
-        myavg = scipy.average(myarray)
-        mymedian = scipy.median(myarray)
-        my90th = scipy.percentile(myarray, 90)
-        my95th = scipy.percentile(myarray, 95)
-        my99th = scipy.percentile(myarray, 99)
-        mymax = scipy.amax(myarray)
+        mymin = min(samplevalues)
+        myavg = sum(samplevalues) / float(len(samplevalues))
+        mymedian = median(samplevalues)
+        my90th = percentile(samplevalues, 0.90) 
+        my95th = percentile(samplevalues, 0.95)
+        my99th = percentile(samplevalues, 0.99)
+        mymax = max(samplevalues)
         print( '%f, %d, %f, %f, %f, %f, %f, %f, %f' % (
             start, len(samplevalues), 
             mymin, myavg, mymedian, my90th, my95th, my99th, mymax))
@@ -125,6 +121,18 @@ def print_all_stats(ctx, series):
         start += ctx.interval
         end += ctx.interval
 
+def median(values):
+    s=sorted(values)
+    return float(s[(len(s)-1)/2]+s[(len(s)/2)])/2
+
+def percentile(values, p):
+    s = sorted(values)
+    k = (len(s)-1) * p
+    f = math.floor(k)
+    c = math.ceil(k)
+    if f == c:
+        return s[int(k)]
+    return (s[int(f)] * (c-k)) + (s[int(c)] * (k-f))
 
 def print_default(ctx, series):
     ftime = get_ftime(series)
@@ -142,11 +150,11 @@ def print_default(ctx, series):
         end += ctx.interval
 
     total = 0
-    for i in xrange(0, len(averages)):
+    for i in range(0, len(averages)):
         total += averages[i]*weights[i]
-    print '%0.3f' % (total/sum(weights))
+    print('%0.3f' % (total/sum(weights)))
  
-class TimeSeries():
+class TimeSeries(object):
     def __init__(self, ctx, fn):
         self.ctx = ctx
         self.last = None 
@@ -180,7 +188,7 @@ class TimeSeries():
             value += sample.get_contribution(start, end)
         return value
 
-class Sample():
+class Sample(object):
     def __init__(self, ctx, start, end, value):
        self.ctx = ctx
        self.start = start
@@ -213,4 +221,3 @@ if __name__ == '__main__':
         print_all_stats(ctx, series)
     else:
         print_default(ctx, series)
-