[Mesa-dev] [PATCH 21/26] python: Use key-functions when sorting containers

Dylan Baker dylan at pnwbakers.com
Thu Jul 5 16:38:19 UTC 2018


Quoting Mathieu Bridon (2018-07-05 06:17:52)
> In Python 2, the traditional way to sort containers was to use a
> comparison function (which returned either -1, 0 or 1 when passed two
> objects) and pass that as the "cmp" argument to the container's sort()
> method.
> 
> Python 2.4 introduced key-functions, which instead only operate on a
> given item, and return a sorting key for this item.
> 
> In general, this runs faster, because the cmp-function has to get run
> multiple times for each item of the container.
> 
> Python 3 removed the cmp-function, enforcing usage of key-functions
> instead.
> 
> This change makes the script compatible with Python 2 and Python 3.
> 
> Signed-off-by: Mathieu Bridon <bochecha at daitauha.fr>
> ---
>  src/mapi/mapi_abi.py | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/src/mapi/mapi_abi.py b/src/mapi/mapi_abi.py
> index 67fdb10650..19fdc4572a 100644
> --- a/src/mapi/mapi_abi.py
> +++ b/src/mapi/mapi_abi.py
> @@ -32,6 +32,7 @@ import os
>  GLAPI = os.path.join(".", os.path.dirname(sys.argv[0]), "glapi/gen")
>  sys.path.append(GLAPI)
>  
> +from operator import attrgetter
>  import re
>  from optparse import OptionParser
>  import gl_XML
> @@ -305,7 +306,7 @@ class ABIPrinter(object):
>  
>          # sort entries by their names
>          self.entries_sorted_by_names = self.entries[:]
> -        self.entries_sorted_by_names.sort(lambda x, y: cmp(x.name, y.name))
> +        self.entries_sorted_by_names.sort(key=attrgetter('name'))

how about:
self.entries_sorted_by_names = list(sorted(self.entries, key=attrgetter('name')))

To avoid the copy and in-place sort.

>  
>          self.indent = ' ' * 3
>          self.noop_warn = 'noop_warn'
> @@ -455,7 +456,7 @@ class ABIPrinter(object):
>          """Return the string pool for use by stubs."""
>          # sort entries by their names
>          sorted_entries = self.entries[:]
> -        sorted_entries.sort(lambda x, y: cmp(x.name, y.name))
> +        sorted_entries.sort(key=attrgetter('name'))
>  
>          pool = []
>          offsets = {}
> -- 
> 2.17.1
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: signature
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180705/c12787e6/attachment-0001.sig>


More information about the mesa-dev mailing list