### Summary

Executing a playbook with many hosts, there is massive overhead in checking whether the hosts list is a pattern, see for yourself on this callgrind graph:

![grafik](https://user-images.githubusercontent.com/3154871/111359016-4a4bf480-868b-11eb-8c8f-55b6a6a10bd7.png)

https://github.com/ansible/ansible/blob/da60525610a384bb04833b1c6429d9db6a87ef64/lib/ansible/vars/manager.py#L490

That check has quadratic runtime with the number of hosts - with a lot of hosts, commenting that check out reduces runtime manyfold.

### Issue Type

Bug Report

### Component Name

variable manager

### Ansible Version

2.10.5, devel

### OS / Environment

Ubuntu

### Steps to Reproduce

```yaml
- hosts: localhost
  tasks:
    - set_fact:
        extra_tasks: true # compute it
        hosts: "{{ [an, array, with, 5100, computed, hosts] }}"

- hosts: "{{ hostvars.localhost.hosts }}"
  vars:
    extra_tasks: "{{ hostvars.localhost.do_extra_tasks }}"
  tasks:
   # some more tasks here
    - name: Execute extra tasks
      command: /bin/true # example
      when: extra_tasks
```

### Expected Results

Execute in tens of seconds.

### Actual Results

Take over 5 minutes to execute.
except KeyError:
            
            
            pass
        host_results = []
        for host in notified_hosts:
            if not iterator.is_failed(host) or iterator._play.force_handlers:
                task_vars = self._variable_manager.get_vars(play=iterator._play, host=host, task=handler,
                                                            _hosts=self._hosts_cache, _hosts_all=self._hosts_cache_all)
                self.add_tqm_variables(task_vars, play=iterator._play)
                templar = Templar(loader=self._loader, variables=task_vars)
                if not handler.cached_name:
                    handler.name = templar.template(handler.name)
                    handler.cached_name = True
                self._queue_task(host, handler, task_vars, play_context)
                if templar.template(handler.run_once) or bypass_host_loop:
                    break
        
        host_results = self._wait_on_handler_results(iterator, handler, notified_hosts)
        included_files = IncludedFile.process_include_results(
            host_results,
            iterator=iterator,
            loader=self._loader,
            variable_manager=self._variable_manager
        )
        result = True
        if len(included_files) > 0:
            for included_file in included_files:
                try:
                    new_blocks = self._load_included_file(included_file, iterator=iterator, is_handler=True)