Are all items in list the same?

Karen Shaeffer klsshaeffer at gmail.com
Wed Jan 9 00:57:28 EST 2019


There was one more error. (smiles ;) Fixed below

def all_equal_array_list(alist) -> bool:

    if alist[1:] == alist[:-1]:

        return True

    return False

def all_equal(alist) -> bool:

    if len(alist) == 0 or all(i == alist[0] for i in alist[1:]):

        return True

    return False

all_equal(tlst) times = [1.3971288939937949e-05] seconds.

all_equal_array_list(tlst) times = [2.3801841149106623e-06] seconds.



Karen.

On Tue, Jan 8, 2019 at 9:01 PM Karen Shaeffer <klsshaeffer at gmail.com> wrote:

> There were some issues with my test. After sending the email, I thought
>
> those times couldn't be real. Here are better results:
>
>
> all_equal(tlst) times = [6.719925760501064e-05] seconds.
>
>
> all_equal_array_list(tlst) times = [4.2184268278069794e-06] seconds.
>
>
> import timeit
>
>
> def all_equal(alist) -> bool:
>
>     if len(alist) == 0 or all(i == alist[0] for i in alist[1:]):
>
>         return True
>
>     return False
>
>
> def all_equal_array_list(alist) -> bool:
>
>     if alist == alist[:-1]:
>
>         return True
>
>     return False
>
>
> tlst = [42 for _j in range(5000)]
>
>
> def timeit_all_equal() -> bool:
>
>     return all_equal(tlst)
>
>
> def timeit_all_equal_array_list() -> bool:
>
>     return all_equal_array_list(tlst)
>
>
> if __name__ == '__main__':
>
>     tae =
> timeit.repeat(timeit_all_equal,repeat=2,number=1000000,globals=globals())
>
>     print(f"all_equal(tlst) times = {[_t/1e6 for _t in tae]} seconds.\n")
>
>
>     taeal =
> timeit.repeat(timeit_all_equal_array_list,repeat=2,number=1000000,globals=globals())
>
>     print(f"all_equal_array_list(tlst) times = {[_t/1e6 for _t in taeal]}
> seconds.\n")
>
> On Tue, Jan 8, 2019 at 3:11 PM Karen Shaeffer <klsshaeffer at gmail.com>
> wrote:
>
>> On 08Jan2019 15:28, Dan Sommers <2QdxY4RzWzUUiLuE at potatochowder.com>
>> wrote:
>>
>> >>    >>> a = [1, 1, 1, 1, 1]
>>
>> >>    >>> a[1:] == a[:-1]
>>
>> >>    True
>>
>> >>    >>> a == a[::-1]
>>
>> >>    True
>>
>> >>
>>
>> >>    >>> a = [1, 2, 3, 4, 3, 2, 1]
>>
>> >>    >>> a[1:] == a[:-1]
>>
>> >>    False
>>
>> >>    >>> a == a[::-1]
>>
>> >>    True
>>
>> >>
>>
>> >> Looks like Peter's pretty clever after all.  :-)
>>
>> >
>>
>> > Except that his solution always scans then entire list. Twice.
>>
>> >
>>
>> > For large dissimilar lists this gets needlessly expensive in a linear
>> fashion
>>
>> > with the length of the list.
>>
>> >
>>
>> > It is succinct, but wasteful.
>>
>> >
>>
>> I ran it with the timeit module for the specific case of a list:
>>
>>
>> tlst = [True for _j in range(int(1e8))]
>>
>>
>> # Very fast.
>>
>> # all_equal(tlst) times = [9.820610110182315e-07, 9.798338289838284e-07,
>> 9.83037088997662e-07,
>>
>> #                          9.824190249200911e-07] seconds.
>>
>> def all_equal(alist) -> bool:
>>
>>     if len(alist) == 0 or all(i == a[0] for i in a[1:]):
>>
>>         return True
>>
>>     return False
>>
>>
>> # The variant: if alist == alist[::-1]:
>>
>> # actually has a memory leak. And I eventually killed the process after
>> waiting about
>>
>> # ten minutes, while watching the memory leak.
>>
>> #
>>
>> # This variant doesn't have a memory leak. I'm still waiting after 15
>> minutes. Might give up
>>
>> # on it. The other solution is the way to go.
>>
>> def all_equal_array_list(alist) -> bool:
>>
>>     if alist == alist[:-1]:
>>
>>         return True
>>
>>     return False
>>
>>
>> if __name__ == '__main__':
>>
>>     tae =
>> timeit.repeat(timeit_all_equal,repeat=4,number=1000000,globals=globals())
>>
>>     print(f"all_equal(tlst) times = {[_t/1e6 for _t in tae]} seconds.\n")
>>
>>
>>     taeal =
>> timeit.repeat(timeit_all_equal_array_list,repeat=4,number=1000000,globals=globals())
>>
>>     print(f"all_equal_array_list(tlst) times = {[_t/1e6 for _t in taeal]}
>> seconds.\n")
>>
>



More information about the Python-list mailing list