Repository: spyder-ide/spyder

Issue:
Profiler is not showing time units 
As it is mentioned in this Stackoverflow post

http://stackoverflow.com/q/40509525/438386

our profiler is not showing the time units spent in every function or method call (e.g. seconds, minutes, etc). We really need to add them to make things clearer for our users.

@malliwi88, please work on this one.


Discussion:
@ccordoba12 Working on it

Ok, the idea is just to add a unit (be it secs or milisecs) to the `Time` column of our profiler. So please investigate what the units reported by the Profiler are, and then just change that column name accordingly.

@malliwi88, this is very easy. Please submit a PR tomorrow about it.


Resolving patch:
diff --git a/spyder_profiler/widgets/profilergui.py b/spyder_profiler/widgets/profilergui.py
--- a/spyder_profiler/widgets/profilergui.py
+++ b/spyder_profiler/widgets/profilergui.py
@@ -495,27 +495,57 @@ def function_info(self, functionKey):
                 node_type = 'constructor'                
             file_and_line = '%s : %d' % (filename, line_number)
         return filename, line_number, function_name, file_and_line, node_type
-        
+
+    def format_measure(self, measure):
+        """Get format and units for data coming from profiler task."""
+        # For number of calls
+        if isinstance(measure, int):
+            return to_text_string(measure)
+
+        # For time measurements
+        if 1.e-9 < measure <= 1.e-6:
+            measure = u"{0:.2f} ns".format(measure / 1.e-9)
+        elif 1.e-6 < measure <= 1.e-3:
+            measure = u"{0:.2f} us".format(measure / 1.e-6)
+        elif 1.e-3 < measure <= 1:
+            measure = u"{0:.2f} ms".format(measure / 1.e-3)
+        elif 1 < measure <= 60:
+            measure = u"{0:.2f} sec".format(measure)
+        elif 60 < measure <= 3600:
+            m, s = divmod(measure, 3600)
+            if s > 60:
+                m, s = divmod(measure, 60)
+                s = to_text_string(s).split(".")[-1]
+            measure = u"{0:.0f}.{1:.2s} min".format(m, s)
+        else:
+            h, m = divmod(measure, 3600)
+            if m > 60:
+                m /= 60
+            measure = u"{0:.0f}h:{1:.0f}min".format(h, m)
+        return measure
+
     def color_string(self, args):
-        x, format = args
+        x, fmt = args
         diff_str = ""
         color = "black"
+
         if len(x) == 2 and self.compare_file is not None:
             difference = x[0] - x[1]
             if difference < 0:
-                diff_str = "".join(['',format[1] % difference])
+                diff_str = "".join(['', fmt[1] % self.format_measure(difference)])
                 color = "green"
             elif difference > 0:
-                diff_str = "".join(['+',format[1] % difference])
+                diff_str = "".join(['+', fmt[1] % self.format_measure(difference)])
                 color = "red"
-        return [format[0] % x[0], [diff_str, color]]
-
+        return [fmt[0] % self.format_measure(x[0]), [diff_str, color]]
 
-    def format_output(self,child_key):
+    def format_output(self, child_key):
         """ Formats the data"""
         if True:
-            data = [x.stats.get(child_key,[0,0,0,0,0]) for x in self.stats1]
-            return map(self.color_string,zip(list(zip(*data))[1:4], [["%i"]*2, ["%.3f","%.3f"], ["%.3f","%.3f"]]))
+            data = [x.stats.get(child_key, [0,0,0,0,0]) for x in self.stats1]
+            format_data = zip(list(zip(*data))[1:4],
+                              [["%s"]*2, ["%s", "%s"], ["%s", "%s"]])
+            return (map(self.color_string, format_data))
             
     def populate_tree(self, parentItem, children_list):
         """Recursive method to create each item (and associated data) in the tree."""
@@ -527,8 +557,6 @@ def populate_tree(self, parentItem, children_list):
             ((total_calls, total_calls_dif), (loc_time, loc_time_dif), (cum_time,
              cum_time_dif)) = self.format_output(child_key)
 
-            (primcalls, total_calls, loc_time, cum_time, callers
-             ) = self.stats[child_key]
             child_item = TreeWidgetItem(parentItem)
             self.item_list.append(child_item)
             self.set_item_data(child_item, filename, line_number)


Test patch: